11

pygameアプリケーションのTableWarsで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

これは、メインループ内でユニットをスポーンし、スポーンユニットに資金を差し引くときに機能します。

今、私は、ユニットが死んだときに、殺人者が犠牲者を返金し、彼が殺したものに基づいて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ません:/

4

3 に答える 3

12

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のグローバルステートメントのコメントを解除すると、機能します。

宣言は、globalDYNAMICスコープではなく、LEXICALでアクティブになります。

于 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 に答える