具有列表本地和全局范围的 Python 奇怪的东西

标签 python list scope

为什么我们可以用附加方法修改列表,但不能用列表连接做同样的事情? 我知道本地和全局范围,我很困惑为什么我们可以用 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/

相关文章:

python - 在 Django 中,我可以排除 ModelForm 子类中的字段吗?

python - 如何从 python 列表中任何特定索引处的句子中提取特定字符串?

Java 下拉 list

c++ - 内部类访问外部类嵌套枚举

Python正则表达式捕获跨越多行的多个匹配项

python - 使用 python 和 opencv 保存视频时出错

r - 计算 R 上列表的平均值

java - 使用来自循环方法的列表内容更新列表

c++ - C++ 中全局变量的替代品

c++ - 模板继承和成员访问