为何修改Python列表形参影响原列表,重新赋值却不影响?
为什么Python函数内append列表会修改原列表,重新赋值参数却不会?
这本质是Python的对象引用传递机制和可变对象的原地操作导致的,拆解来看:
1. append() 修改原列表的原因
Python里列表是可变对象,当你把data传入add_item函数时,参数items拿到的是指向原列表对象的引用(可以理解为指向内存中该列表的“地址”)。
items.append("new")是对这个引用指向的原对象做原地修改——没有创建新列表,只是在原列表的内存空间里添加了元素。所以外部的data因为指向同一个对象,自然能看到修改后的结果。
2. 重新赋值参数不生效的原因
在replace_item函数里,items = ["x", "y"]这行代码不是修改原对象,而是给局部变量items重新绑定了一个全新的列表对象。
此时函数内的items不再指向原来的data列表,而是指向了内存中新创建的["x", "y"]。但外部的data依然指向原来的列表对象,所以原列表不会有任何变化。
用内存地址验证(辅助理解)
你可以在代码里加入id()打印来直观看到引用的变化:
def add_item(items): print("add_item里items的id:", id(items)) items.append("new") def replace_item(items): print("replace_item初始items的id:", id(items)) items = ["x", "y"] print("replace_item赋值后items的id:", id(items)) data = ["a", "b"] print("data的id:", id(data)) add_item(data) print(data) replace_item(data) print(data)
输出会显示:
data的id: 140697756546304 add_item里items的id: 140697756546304 ['a', 'b', 'new'] replace_item初始items的id: 140697756546304 replace_item赋值后items的id: 140697756548096 ['a', 'b', 'new']
能看到add_item里的items和data始终是同一个id;而replace_item赋值后,items的id变了,说明指向了新对象。
内容的提问来源于stack exchange,提问作者楊翔宇
相关产品推荐
相关产品推荐

