为何无法在自定义函数中直接重写列表?示例解析
为什么直接在函数里重写列表变量无法修改原列表?
这个问题其实戳中了Python参数传递和可变对象赋值的关键逻辑,咱们来慢慢理清楚:
首先得明确:Python的参数传递是传对象引用(也可以理解为“共享引用传递”)。当你把全局的y传入函数时,函数内部的参数y和全局的y一开始指向的是同一个列表对象。
但你在函数里写的y = y[:3],本质上做了两件事:
y[:3]会创建一个原列表的切片副本,这是一个全新的列表对象- 把函数内部的局部变量
y重新赋值,让它指向这个新对象——这时候,函数里的y和全局的y已经指向不同的对象了,修改这个局部变量自然不会影响原来的列表。
而像.append()、del这类列表方法,是直接在原列表对象的内存地址上修改内容,没有改变变量的指向,所以全局变量能看到修改后的结果。
两种可行的解决办法:
方法1:接收函数返回的新列表
让函数返回处理后的新列表,再把全局变量重新赋值为这个返回值:
def function(y): y = y[:3] return y y = [0,1,2,3,4] y = function(y) # 接收返回的新列表 print(y) # 输出 [0, 1, 2]
方法2:直接修改原列表对象
用切片赋值的方式,直接修改原列表的内容,而不是重新赋值变量:
def function(y): y[:] = y[:3] # 直接覆盖原列表的全部内容为前3个元素 y = [0,1,2,3,4] function(y) print(y) # 输出 [0, 1, 2]
内容的提问来源于stack exchange,提问作者mj li
相关产品推荐
相关产品推荐

