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()
这在 traceback 中给我以下错误:UnboundLocalError: local variable 'x' referenced before assignment.
当 Python 在赋值时找不到要使用的 x 的值时,为什么不会像我的 class Incr 一样搜索封闭空间中的 x?请注意,我不是在问如何让这个函数工作。如果我执行以下操作,我知道该函数将正常运行:
x = 1
def incr():
global x
print(x)
x = x + 1
print(x)
incr()
这将正确打印:
1
2
就像我预期的一样。我想问的是,为什么当关键字 global
不出现时,它不会像上面我的类那样从封闭的作用域中提取 x
。既然函数能够读取并打印出 x
的值,我知道它已经将 x
作为封闭作用域的一部分...那为什么这个方法不能像类的例子一样工作呢?为什么解释器需要将其报告为 UnboundLocalError
,而显然它知道某些 x
是存在的。
为什么将 x
的值用于打印与将其值用于赋值如此不同?我真的不明白。
incr()
函数中使用x+=1
吗?__add__
和__iadd__
之间可能会有所不同。 - inspectorG4dgetx+=1
,将会得到相同的结果。 - Shashank