为何无法在函数中重新赋值作为参数传入的列表?
为什么foo()能修改原列表,bar()却不行?
先看这段代码的实际运行输出:
[1,2,3] [3,2,3] [3,2,3]
问题的核心在于Python函数参数的传递逻辑——它是传对象引用,不是直接传原对象,也不是传引用的副本。
拆解foo()的工作逻辑
def foo(myList): myList[0] = 3
当你把原列表[1,2,3]传给foo时,函数里的myList变量拿到的是原列表对象的引用,指向的是同一个内存里的列表。这时候通过myList[0] = 3修改的是这个列表对象的内部元素,自然会影响到原列表。
拆解bar()的工作逻辑
def bar(myList): myList = [3,2,1]
这里的myList = [3,2,1]是给函数内部的myList变量重新赋值,让它指向了一个新创建的列表对象。这时候函数里的myList和原来的列表已经没有关系了,原列表的引用没被改动,所以原列表不会有任何变化。
一句话总结:
- 操作对象的内部内容(比如改列表元素、调用append之类的方法),会影响原对象;
- 直接给参数变量赋值新对象,只是换了函数内部变量的指向,和原对象无关。
内容的提问来源于stack exchange,提问作者handsome donkey
相关产品推荐
相关产品推荐

