我正试图弄清楚为什么在pygame应用程序Table Wars中会出现unbundlocalerror。以下是所发生情况的摘要:
变量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
将不起作用:/
您需要在修改变量的每个作用域中将其声明为全局变量
最好还是找到一个不使用globals的方法。例如,这些是类属性有意义吗?
global
使全局变量在当前代码块中可见。您只将global
语句放入main
,而不是attack
。附录
这里有一个例子说明需要多次使用global。试试这个:
您将得到错误
UnboundLocalError: local variable 'RED' referenced before assignment
。现在在f中取消注释全局语句,它就可以工作了。
global
声明在词法范围而不是动态范围中处于活动状态。发现
main
中的变量类似于函数中的全局“只读”变量。如果我们尝试重新分配值,它将生成错误。尝试:
没关系。
但是:
生成
以及:
生成
相关问题 更多 >
编程相关推荐