另一个python范围问题

时间:2015-03-30 10:02:07

标签: python scoping

我已经阅读过一堆范围的帖子,但我没有找到答案。我使用python 2.7.6。 这是代码:

def play(A, B):
    state = START_STATE
    #player = None
    while state[1] < goal and state[2] < goal:
        if state[0]:
            player = B
        else:
            player = A
         state = resolve_state(state, player(state))
    return player

这会引发UnboundLocalError。在总是返回None变量时取消注释第3行效果,但我确信播放器变量始终是A或B.使播放器成为全局变量可以解决问题。谁能解释这种行为?从我读过的内容和if语句不创建它们的作用域,所以函数应该是while / if块中声明的变量的作用域。

错误说:“UnboundLocalError:在赋值之前引用的局部变量'player'

我确信循环执行是因为START_STATE =(0,0,0,0)+我用打印双重检查+使播放器全局解决问题并且它不会影响循环入口条件

@jonathan - &gt;它保留了旧版本

1 个答案:

答案 0 :(得分:1)

你的代码是而不是通过循环 - 这是一个简化的代码来演示它:

# noloop.py

def loop(A, B, x):
    #player = None
    while x:
        if True:
            player = B
        else:
            player = A
        x = False

    return player

以及通话和结果:

>>> import noloop
>>> noloop.loop("A", "B", True)
'B'
>>> noloop.loop("A", "B", False)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "noloop.py", line 12, in loop
    return player
UnboundLocalError: local variable 'player' referenced before assignment
>>> 

所以你的断言是错的,点清楚。请注意,您的代码依赖于两个全局变量START_STATEgoal,这使得调试更加困难。首先重写你的函数以摆脱所有全局变量(提示:传递START_STATEgoal作为参数),然后添加一些调试代码(如循环之前,之内和之后的一些打印语句),以及你可能会发现自己出了什么问题。