我想弄清楚为什么我的pygame应用程序Table Wars中出现UnboundLocalError。以下是对所发生情况的总结:
变量REDGOLD
,REDCOMMAND
,BLUEGOLD
和BLUECOMMAND
初始化为全局变量:
#Red Stat Section
REDGOLD = 50
REDCOMMAND = 100
#Blue Stat Section
BLUEGOLD = 50
BLUECOMMAND = 100
def main():
[...]
global REDGOLD
global REDCOMMAND
global BLUEGOLD
global BLUECOMMAND
这适用于在主循环中产生单位,减去产生单位的资金。
现在,我正在尝试建立一个系统,以便当一个单位死亡时,杀手会根据他杀死的内容退还受害者的COMMAND
并获得GOLD
:
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
将不起作用:/
答案 0 :(得分:9)
global
使全局变量在当前代码块中可见。您只需将global
语句放在main
中,而不是attack
。
<强>附录强>
以下是不止一次使用全球需求的说明。试试这个:
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中的全局语句,它将起作用。
global
声明在LEXICAL中有效,而不是DYNAMIC范围。
答案 1 :(得分:3)
您需要在变量被修改的每个范围内将变量声明为全局变量
更好的是找到一种不使用全局变量的方法。例如,对于那些属于类属性的人来说是否有意义?
答案 2 :(得分:2)
发现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