这纯粹是一个方法论问题。我有一个基本函数,它意外地将值附加到我创建的列表中。我知道.append()
和.extend()
会在适当的位置更改列表对象,但我的特殊问题是+=
。
我的印象是x+=y
与x = x+y
相同,但函数中的情况并非如此,我发现它覆盖了函数外部定义的局部变量。
请允许我举例说明:
def test1(lst):
lst += ['new element']
return 'something else'
def test2(lst):
lst = lst + ['new element']
return 'something else'
# Testing them
lst = ['a','sample','list']
test1(lst)
print('test1 returns the following:',lst)
lst = ['a','sample','list']
test2(lst)
print('test2 returns the following:',lst)
这将返回
test1 returns the following: ['a', 'sample', 'list', 'new element']
test2 returns the following: ['a', 'sample', 'list']
当然,如果您更改变量的名称,则它不会执行此操作。但这从根本上改变了我对函数中定义的变量的理解,而不是局部的,这可能会对我的编码行为产生一些严重的影响。有人能清楚地解释发生了什么吗?
当然,如果您更改变量的名称,那么它不会这么做。
那不是真的。观察:
def test1(foo):
foo += ['new element']
def test2(foo):
foo = foo + ['new element']
lst = ['a','sample','list']
test2(lst) # lst stays the same
test1(lst) # lst gets changed
在这两种情况下,我们都将foo
绑定到也称为lst
的列表。在test2
中,我们将此列表添加到包含'new element'
的列表中的结果分配给本地名称foo
。
在test1
中,我们使用+=
操作符修改列表。
我认为
x+=y
与x = x+y
相同
这不是真的,但其中有一个核心真理:当__iadd__
没有在x
的类型上定义时,Python默认执行x = x + y
。此外,即使只在函数中使用增广赋值运算符(如+=
(,编译器也会将该名称标记为本地(STORE
/LOAD_FAST
(。