[英]How Scope of variable (local global and nonlocal) work for mutable object like List in Python?
我正在编写如下程序来测试我对 Python 变量范围的了解
def show(a,b):
def add():
a = a+b #Error at this line "UnboundLocalError: local variable 'a' referenced before assignment"
#I know we can use nonlocal a,b to avoid error
add()
print("a=",a)
x=4
y=2
show(x,y)
然后我尝试了相同的程序,并以 x 和 y 作为列表进行了一些小改动。 代码如下图
def show(a,b):
def add():
a[0] = a[0]+b[0] #No Error at this line
add()
print("a=",a[0])
x=[4]
y=[2]
show(x,y)
这段代码运行良好。 我在 python 中没有得到这种奇怪的行为。
所有变量的范围规则都相同。 它们引用什么对象并不重要。
但是, a = a + b
和a[0] = a[0] + b[0]
是不同的东西。
第一个是分配给一个全局变量,该变量实际上被 Python视为本地变量。 详细信息可以在这篇文章中找到: Python 函数全局变量?
第二个是语法糖,不做作业! 它被脱糖(在内部翻译)到对__setitem__
的调用:
a.__setitem__(0, a[0] + b[0])
正如您所看到的,这里没有分配,上面的第 (1) 点不适用,所以这里没有问题。
一般来说,像a[i] = b
这样a[i] = b
代码会被翻译成a.__setitem__(i, b)
,其他一些语法也会被翻译成函数调用,比如a + b
可以是a.__add__(b)
, a[0]
是a.__getitem__(0)
等等。
所以, a[0] = a[0] + b[0]
最终会成为这个怪物:
a.__setitem__(0, a.__getitem__(0).__add__(b.__getitem__(0)))
没有赋值 - 全局变量突然变成局部没有问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.