如果我运行以下代码:
x = 1
class Incr:
print(x)
x = x + 1
print(x)
print(x)
它打印:
1
2
1
好的,没问题,这正是我所期望的。如果我执行以下操作:
x = 1
class Incr:
global x
print(x)
x = x + 1
print(x)
print(x)
它打印:
1
2
2
也是我所期望的。那里没有问题。
现在,如果我开始按如下方式创建增量函数:
x = 1
def incr():
print(x)
incr()
正如我预期的那样打印 1 。我假设它这样做是因为它无法x
在其本地范围内找到,因此它搜索其封闭范围并在x
那里找到。到目前为止没有问题。
现在,如果我这样做:
x = 1
def incr():
print(x)
x = x + 1
incr()
这在回溯中给了我以下错误:
UnboundLocalError:分配前引用的局部变量“x”。
为什么 Python 不能像我一样在x
找不到x
用于赋值的值时搜索封闭空间class Incr
?请注意,我不是在问如何使此功能起作用。我知道如果我执行以下操作,该功能将起作用:
x = 1
def incr():
global x
print(x)
x = x + 1
print(x)
incr()
这将正确打印:
1
2
正如我所料。我要问的是为什么x
当关键字不存在时它不只是从封闭范围中拉出来,global
就像我在上面的课程中所做的那样。为什么口译员觉得有必要报告这一点,因为UnboundLocalError
它清楚地知道有些x
存在。由于该函数能够读取x
打印的值,我知道它具有x
作为其封闭范围的一部分......那么为什么这不像类示例那样工作?
为什么使用x
for print 的值与使用它的值进行赋值如此不同?我只是不明白。