【发布时间】:2013-09-22 17:30:17
【问题描述】:
如果我运行以下代码:
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 无法像我的 class Incr 那样找到用于赋值的 x 值时,为什么 Python 不只是在封闭空间中搜索 x?请注意,我不是在问如何使此功能起作用。我知道如果我执行以下操作,该功能将起作用:
x = 1
def incr():
global x
print(x)
x = x + 1
print(x)
incr()
这将正确打印:
1
2
正如我所料。我要问的是,当关键字global 不存在时,为什么它不只是从封闭范围中拉出x,就像我在上面的课程中所做的那样。当解释器清楚地知道某些x 存在时,为什么解释器觉得有必要将其报告为UnboundLocalError。由于该函数能够读取x 处的值进行打印,我知道它具有x 作为其封闭范围的一部分......那么为什么这不像类示例那样工作?
为什么使用x 的值进行打印与使用其值进行赋值如此不同?我就是不明白。
【问题讨论】:
-
这是 Python2 还是 Python3?
-
你考虑过在
incr()函数中使用x+=1吗?__add__和__iadd__之间可能存在差异 -
@Ethan 这是 Python 2.75。我使用括号是因为我最近经常切换语言,而且它更加统一。
-
@inspectorG4dget 如果您尝试
x+=1,则会出现相同的结果。