11

我试图弄清楚为什么在我的 pygame 应用程序 Table Wars 中出现 UnboundLocalError。以下是所发生情况的摘要:

变量 ,REDGOLD和,REDCOMMAND被初始化为全局变量:BLUEGOLDBLUECOMMAND

#Red Stat Section
REDGOLD = 50
REDCOMMAND = 100
#Blue Stat Section
BLUEGOLD = 50
BLUECOMMAND = 100

def main():    

    [...]

    global REDGOLD
    global REDCOMMAND
    global BLUEGOLD
    global BLUECOMMAND

这在主循环中生成单位时有效,从生成单位中减去资金。

现在,我正在尝试建立一个系统,以便当一个单位死亡时,杀手退还受害者COMMANDGOLD根据他杀死的东西获得收入:

class Red_Infantry(pygame.sprite.Sprite):
def __init__(self, screen):
    [...]
    self.reward = 15
    self.cmdback = 5

[...]

def attack(self):
    if self.target is None: return
    if self.target.health <= 0:
        REDGOLD += self.target.reward          #These are the problem lines
        BLUECOMMAND += self.target.cmdback     #They will cause the UnboundLocalError
                                               #when performed
        self.target = None
    if not self.cooldown_ready(): return
    self.target.health -= self.attack_damage
    print "Target's health: %d" % self.target.health

这一直有效,直到单位死亡。然后会发生这种情况:

Traceback (most recent call last):
File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 606, in <module>
main()
File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 123, in main
RedTeam.update()
File "C:\Python27\lib\site-packages\pygame\sprite.py", line 399, in update
for s in self.sprites(): s.update(*args)
File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 304, in update
self.attack()
File "C:\Users\Oventoaster\Desktop\Games\Table Wars\Table Wars.py", line 320, in attack
REDGOLD += self.target.reward
UnboundLocalError: local variable 'REDGOLD' referenced before assignment

如何让上面提到的全局变量随attack块而变化?如果有帮助,我正在使用 Pygame 2.7.x,所以nonlocal不会工作:/

4

3 回答 3

12

global使全局变量在当前代码块中可见。您只将global语句放入main,而不放入attack

附录

这是需要多次使用 global 的说明。尝试这个:

RED=1

def main():
    global RED
    RED += 1
    print RED
    f()

def f():
    #global RED
    RED += 1
    print RED

main()

你会得到错误UnboundLocalError: local variable 'RED' referenced before assignment

现在取消注释 f 中的全局语句,它将起作用。

声明在globalLEXICAL 而非 DYNAMIC 范围内处于活动状态。

于 2012-05-23T22:25:06.817 回答
4

您需要在要修改它们的每个范围内将变量声明为全局变量

最好找到一种不使用全局变量的方法。例如,将那些作为类属性有意义吗?

于 2012-05-23T22:25:09.997 回答
3

发现main变量在函数中的行为类似于全局“只读”变量。如果我们尝试重新分配该值,则会产生错误。

尝试:

#!/usr/bin/env python
RED=1
A=[1,2,3,4,5,6]

def f():
    print A[RED]

f()

没关系。

但:

#!/usr/bin/env python
RED=1
A=[1,2,3,4,5,6]

def f():
    print A[RED]
    A = [1,1,1,1,1]

f()

产生

  File "./test.py", line 6, in f
    print A[RED]
UnboundLocalError: local variable **'A'** referenced before assignment

和:

#!/usr/bin/env python
RED=1
A=[1,2,3,4,5,6]

def f():
    print A[RED]
    RED = 2

f()

产生

  File "./test.py", line 6, in f
    print A[RED]
UnboundLocalError: local variable **'RED'** referenced before assignment
于 2014-01-15T13:08:58.313 回答