2012-05-23 6 views
6

내 파이 게임 응용 프로그램 인 테이블 전쟁에서 UnboundLocalError가 왜 발생하는지 파악하려고합니다. 여기에 무슨 일을 요약 한 것입니다 : 산란에 자금을 빼서, 메인 루프 내에서 단위를 산란 할 때 작동전역 변수가있는 언 바운드 로컬 오류

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

def main():  

    [...] 

    global REDGOLD 
    global REDCOMMAND 
    global BLUEGOLD 
    global BLUECOMMAND 

:

변수, REDGOLD, REDCOMMAND, BLUEGOLDBLUECOMMAND가 전역 변수로 초기화된다 단위. 지금

, 나는 유닛이 죽을 때, 피해자의 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이 작동하지 않습니다./

답변

9

전역 변수를 현재 코드 블록에서 볼 수있게하십시오. global 문은 이 아닌 main에만 넣습니다.

부칙 여기

는 한 번 이상 세계 이상을 사용하는 필요의 그림입니다. 이것을 시도하십시오 :

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에서 활성화됩니다.

+0

를 생성 I 그랬어. 전역 변수는 main() 함수가 화면을 설정하고 시계를 초기화 한 직후 메인 루프에서 호출됩니다. – Oventoaster

+0

멋지게 작동합니다. 고맙습니다! – Oventoaster

3

당신은

더 나은

을 수정 아직 전역을 사용하지 수있는 방법을 찾아야되고 각 범위에 글로벌로 변수를 선언해야합니다. 그것들이 예를 들어 클래스 속성이되는 것이 맞습니까?

1

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 
관련 문제