函数中使用+=意外分配给python中命名空间中的变量



这纯粹是一个方法论问题。我有一个基本函数,它意外地将值附加到我创建的列表中。我知道.append().extend()会在适当的位置更改列表对象,但我的特殊问题是+=

我的印象是x+=yx = 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+=yx = x+y相同

这不是真的,但其中有一个核心真理:当__iadd__没有在x的类型上定义时,Python默认执行x = x + y。此外,即使只在函数中使用增广赋值运算符(如+=(,编译器也会将该名称标记为本地(STORE/LOAD_FAST(。

最新更新