为何func无法修改外部orig列表,而func1能修改orig1列表?
Python函数参数传递:修改列表元素影响外部,重新赋值却不影响的原因
你遇到的情况是:两段Python代码中,func函数对形参重新赋值为新列表后,外部的orig列表没有变化;但func1函数修改形参列表的指定元素后,外部的orig1列表被改变了,这和之前“函数无法修改外部变量”的认知冲突。
示例代码
代码1:重新赋值形参为新列表
def func(list): list = ['mon', 'tue', 'wed', 'thu','fri','sun'] return list orig = ['mon', 'tue', 'wed', 'thu','sat','sun'] ret = func(orig) print(orig, ret)
代码2:修改形参列表的元素
def func1(list1): list1[4]='fri' return list1 orig1 = ['mon', 'tue', 'wed', 'thu','sat','sun'] ret1 = func1(orig1) print(orig1, ret1)
原因解释
Python的参数传递规则是传对象引用,核心区别在于你是操作了引用指向的对象本身,还是改变了引用的指向:
- 在
func里,形参list一开始和外部的orig指向同一个列表对象,但list = 新列表这行代码是把list这个变量重新绑定到了一个全新的列表对象上,和原来的orig彻底没关系了,所以外部的orig不会受到任何影响。 - 在
func1里,形参list1和外部的orig1指向同一个列表对象,list1[4]='fri'是直接修改了这个共享对象内部的元素值,因为两者指向同一个对象,所以外部的orig1自然会看到这个修改结果。
如果想让func也能修改外部的orig列表,不能直接重新赋值新对象,而是要修改原对象的内容,比如:
def func(list): list.clear() list.extend(['mon', 'tue', 'wed', 'thu','fri','sun']) return list
这样操作的是原列表对象,外部的orig就会同步变化。
内容的提问来源于stack exchange,提问作者ssarfraz336
相关产品推荐
相关产品推荐

