到目前为止,我遇到了我遇到的最奇怪的错误。我的代码很简单:
wtf = 5
def update():
print(wtf)
wtf = 1
update()
注释掉行# wtf = 1
,一切正常,打印5。但是,如果我取消注释# wtf = 1
,在我打印wtf
(5)之前,我会收到UnboundLocalError: local variable 'wtf' referenced before assignment
。我不知道WTF在这里发生了什么。为什么会这样?
答案 0 :(得分:2)
如果您在该功能中拥有print(wtf)
,则Python会假定您只是尝试打印全局wtf
。如果你添加wtf = 1
,那么Python就会被迫假设你正在尝试更改局部变量 - 你不能为函数中的全局变量赋值,除非你使用{{ 1}}在顶部。因此,在第二种情况下,Python假定global wtf
是本地的,这就是wtf
语句失败的原因 - 您现在尝试在分配之前打印局部变量,或者Python认为
要解决此问题,请添加print(wtf)
作为global wtf
功能的第一行。
答案 1 :(得分:1)
如果有可能在范围中分配变量,则该变量将成为该范围的本地变量。使用global
表示全局变量可以阻止这种行为,对于Python 3中的任何非本地变量使用nonlocal
:
wtf = 5
def update(dt):
nonlocal wtf
print(wtf)
wtf = 1