当我尝试这段代码:
a, b, c = (1, 2, 3)
def test():
print(a)
print(b)
print(c)
c += 1
test()
我从打印(c)行得到一个错误,它说:
UnboundLocalError: local variable 'c' referenced before assignment
在Python的新版本中,或者
UnboundLocalError: 'c' not assigned
在一些老版本中。
如果注释掉c += 1,两次打印都成功。
我不明白:如果c不行,为什么打印a和b可以?c += 1是如何导致print(c)失败的,即使它出现在代码的后面?
赋值c += 1似乎创建了一个局部变量c,它优先于全局变量c。但是一个变量如何在它存在之前“窃取”作用域呢?为什么c是局部的?
请参见在函数中使用全局变量,了解如何从函数中重新分配全局变量的问题,以及是否可以在python中修改位于外部(封闭)但不是全局范围的变量?用于从封闭函数(闭包)重新赋值。
参见为什么不需要'global'关键字来访问全局变量?对于OP预期错误但没有得到错误的情况,从简单地访问一个没有global关键字的全局变量。
参见如何在Python中“解除绑定”名称?什么代码可以导致“UnboundLocalError”?对于OP期望变量是本地的,但在每种情况下都有阻止赋值的逻辑错误的情况。
在下面n = num的情况下,n是一个局部变量,num是一个全局变量:
num = 10
def test():
# ↓ Local variable
n = num
# ↑ Global variable
print(n)
test()
因此,没有错误:
10
但是在下面的num = num的情况下,两边的num是局部变量,右边的num还没有定义:
num = 10
def test():
# ↓ Local variable
num = num
# ↑ Local variable not defined yet
print(num)
test()
所以,有下面的错误:
UnboundLocalError:赋值前引用的本地变量'num'
此外,即使删除num = 10,如下所示:
# num = 10 # Removed
def test():
# ↓ Local variable
num = num
# ↑ Local variable not defined yet
print(num)
test()
下面是同样的错误:
UnboundLocalError:赋值前引用的本地变量'num'
因此,为了解决上述错误,将global num放在num = num之前,如下所示:
num = 10
def test():
global num # Here
num = num
print(num)
test()
这样,上述误差就得到了解决,如下图所示:
10
或者,在num = num之前定义局部变量num = 5,如下所示:
num = 10
def test():
num = 5 # Here
num = num
print(num)
test()
这样,上述误差就得到了解决,如下图所示:
5