为什么我们可以用附加方法修改列表,但不能用列表连接做同样的事情? 我知道本地和全局范围,我很困惑为什么我们可以用 append 方法做到这一点,提前致谢
some_list=[]
def foo():
some_list.append('apple')
foo()
print(some_list)
#it works
使用列表连接
some_list=[]
def foo():
some_list+=['apple']
foo()
print(some_list)
#UnboundLocalError: local variable 'some_list' referenced before assignment
最佳答案
+=
等增强操作会重新分配原始变量,即使这并非绝对必要。
Python 的运算符转换为对对象的魔法方法的调用:__iadd__
for +=
。像 int
这样的不可变对象(immutable对象)不能改变自己,所以你不能像在 C 中那样做就地 +=
。相反,python 的增强方法返回一个对象到被重新分配给被操纵的变量。像列表这样的可变对象只会返回它们自身,而不可变对象(immutable对象)会返回一个不同的对象。
由于正在重新分配变量,因此它必须遵循与任何其他变量相同的范围规则。重新分配会导致 python 假定该变量位于本地命名空间中,您需要 global
关键字来覆盖该假设。
关于具有列表本地和全局范围的 Python 奇怪的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73185954/