为什么它说(在python中)“UnboundLocalError:局部变量’是’在赋值之前引用’当我已经定义了变量?

Why does it say (in python) “UnboundLocalError: local variable 'yes' referenced before assignment” when I already defined the variable?

本问题已经有最佳答案,请猛点这里访问。

这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from random import randint

ant1 = 1
ant2 = 2
ant3 = 3
ant4 = 4
cntNum = 0
no = 0
yes = 0

def antMove(antNum):
    randomNum = randint(0,3)
    if randomNum == antNum:
        yes += 1
    else:
        print("No")  

while cntNum < 20:
    antMove(ant1)
    antMove(ant2)
    antMove(ant3)
    antMove(ant4)
    cntNum = cntNum + 1

if cntNum == 20:
    print(yes)


消息的重要部分是在赋值之前引用的粗体:unboundlocalerror:local变量"yes"。

在下一行中,您试图更新在函数的本地范围内不存在的yes变量的值:

1
yes += 1

我假设您想要更新全局yes变量。在这种情况下,您必须在函数中将yes变量声明为全局变量:

1
2
def antMove(antNum):
    global yes

但有人承认,这是一个糟糕的实践,你应该找到一个更好的方法来实现你的愿望。


这里有一个范围问题。在你的脚本中,yes出现了2次。1次作为全局变量,1次作为-不存在-局部变量。除此之外,这是危险的,你可以用类似的东西来解决你的问题

1
2
3
4
5
6
7
def antMove(antNum):
    global yes
    randomNum = randint(0,3)
    if randomNum == antNum:
        yes += 1
    else:
        print("No")

你看到global yes声明了吗?这允许您在方法的上下文中编写全局变量yes

在大多数情况下,我都看到了这一点,global对于来自C的人或者编码错误的人来说都是一个信号。如果您重用您的小脚本,调试错误增加的yes将会很有趣。