Python中向函数传递列表时为何无法直接修改列表本身
Python列表传参修改行为差异的底层原因
核心原因是Python采用传对象引用的参数传递规则,且列表属于可变对象,两类操作的修改目标完全不同:
- 第一种情况(修改列表元素生效)
调用myFun(lst)时,形参x和外层的lst指向内存中同一个列表对象,没有生成新的副本。x[i] += 2属于就地修改可变对象的内部元素,操作过程中没有改变x的指向,所有修改都是直接作用在共享的列表对象上,因此外层的lst访问同一个对象时就能感知到变化。 - 第二种情况(给形参赋值新列表不生效)
传参初期x和lst确实指向同一个列表,但x = [20, 30, 40]属于给局部变量x重新赋值,直接把x的指向修改为了新创建的列表对象,这个操作既不会改变外层lst的指向,也不会修改原列表对象的内容,因此外层的lst不会受到影响。
如果需要让第二种修改对外层生效,可以通过函数返回值重新赋值外层变量:
def myFun(x): x = [20, 30, 40] return x lst = [10, 11, 12, 13, 14, 15] lst = myFun(lst) print(lst) # 输出 [20, 30, 40]
内容的提问来源于stack exchange,提问作者NhanChau
相关产品推荐
相关产品推荐

