更改变量会导致在赋值之前引用

时间:2014-07-28 16:39:55

标签: python

到目前为止,我遇到了我遇到的最奇怪的错误。我的代码很简单:

wtf = 5
def update():
    print(wtf)
    wtf = 1

update()

注释掉行# wtf = 1,一切正常,打印5。但是,如果我取消注释# wtf = 1,在我打印wtf(5)之前,我会收到UnboundLocalError: local variable 'wtf' referenced before assignment。我不知道WTF在这里发生了什么。为什么会这样?

2 个答案:

答案 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