를 사용해야 합 글로벌 액세스하는 지역 변수(왜)python;고급 프로그래밍
문제
나는 최근에 다운로드 고급 프로그래밍으로 그것이 내게 가장 이해할 수 있는 튜토리얼 문서,등등.해봤 pygame 과 코코스 하지만 결코 얻을 수 있는 기초 및 고급 프로그래밍 그것은 쉽습니다.
So heres 나의 문제가,오늘은 한 테이블 게임과 노력하고 게임을 만들기 위해 일시 중지하여 탁구를 공고한 다음 시작할 때 다시는 그것의 일시중지를 해제하여(변경 속도).
여기 나의 코드:
class PongGame(Widget):
...
def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
if keycode[1] == 'escape':
#Why doesnt it work without global?
#If I don't use a global i get "tempBallVelocity referenced before assignment
global tempBallVelocity
tempBallVelocity = self.ball.velocity
self.ball.velocity = 0,0
if keycode[1] == '`':
#Make the ball go again, thus exiting pause
#This is where the error occurs if I don't use global
self.ball.velocity = tempBallVelocity
당신이 볼 수있는 의견을 못하는 경우에는 사용 세계,나를 얻을 참조하기 전에 할당 오류가 있습니다.하지만 그것은 지역 변수,이해가 왜 이런 일들이 벌어지고 있습니다.
누구나 어떤 아이디어가 있습니까?감사?
편집:지 확인하기 위해 모두가명한 것은 내 기도,나는 사용하지 않으려는 세계이지만,그것은 유일한 방법으로 작동합니다.내가 선호하는 것을 사용하지 않 globals.
해결책
당신의 들여쓰기에 오류가 다시 당신이 볼 것이다:
당신이 볼 수 있는:
탈출
escape
없이 작동 글로벌 그러나,tempBallVelocity
으로 간주됩니다 지역 변수입니다.수정하려면 전역 변수를 추가할 필요가 세계 선언을 말하는 파이썬tempBallVelocity
지 않은 로컬 하지만 글로벌입니다.두 번째 경우에,
tempBallVelocity
지 않은 로컬로 초기화되지 않는 경우에 입력하 탈출을 차단하고 따라서으로 사용할 수 없습니다 지역 번씩만.이 경우에는 파이썬 찾아야 한다는 변수의 외부 클래스입니다.가tempBallVelocity
정말 글로벌 변?
말:하는 경우에는 독점적인 사용해야 합니다 elif
대 if
두번째 경우.
다른 팁
귀하의 코드가 내부에는 기능을 들여쓰지 않습는 그냥 복사하는 실수를 했을까요?하지 않는 경우 왜 당신을 얻지 못한 오류가 있습니다.
편집:Ok,그것은 쉽게 설정할 변수 tempBallVelocity
를 호출할 경우 기능으로 'escape'
하지만 그런 다음 기능을 종료하고 당신은 느슨한 변수입니다.는 경우에 당신은 그것을 가진'백틱'하지 않은 변수 설정 tempBallVelocity
아직 최고의 솔루션을 것:self.tempBallVelocity = self.ball.velocity
.
식별 된 코드 블록 내에서 변수를 설정할 때마다 변수가 해당 블록에서 빠져 나오면 이전 식별으로 돌아갑니다.
를 작성하면
if True:
foo = 'foo value, which is a string (?)'
print foo
.
거대한 스크립트 내에서 파이썬은 if 문을 '내부'하는 동안 foo 변수 만 처리하고 일단 끝나면 Foo가 완전히 잊어 버리려면 완전히 잊어 버리고, 당신이 그것을 설정하면 변수 문 내부에서는 그 문장에서만 사용할 수 있습니다.
이렇게하고 싶다면
if True:
foo = 'foo value'
# Right now foo has been trashed
if True:
print foo
# Raises an error
.
foo 변수를 'If'명령문
외부로 설정해야합니다foo = ''
if True:
foo = 'foo value'
# Right now foo still exists and keeps it's recently changed value
if True:
print foo
# prints 'foo value'
.
또는 'if'명령문 밖에서 밖으로 얻는 일단 foo를 전역 변수로 설정하면 해당 할 수 있습니다
if True:
global foo
foo = 'foo value'
# foo still exists as it's a global variable
if True:
print foo
# There's no reason so it wouldn't work
.
그러나 그 모든 것을 글로벌이므로 전역에만 사용하는 변수가 프로그램 중에 쓸모가 없으므로 모든 것을 전역의 메모리에 쓸모가 없게 만들기 시작하면 불필요하고 혼란 스러울 수 있습니다.
지금은 클래스를 작성하고 있으므로이 작업을 수행하는 올바른 방법은 (내 관점에서) 'tempballvelocity'변수를이
와 같은 클래스에서 저장합니다.class PongGame(Widget):
...
def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
if keycode[1] == 'escape':
self.tempBallVelocity = self.ball.velocity
self.ball.velocity = 0,0
if keycode[1] == '`':
self.ball.velocity = self.tempBallVelocity
.
방금 당신에게 말했던 규칙을 존중하지 않는 것처럼 보입니다. 여기에서는 'self.tempballvelocity= ...'쓸 때 당신이 자체의 정보를 보관하고 있습니다. 게임을 실행하기 위해 인스턴스화하는 PongGame 객체는 해당 메소드를 실행하므로 메서드를 나가면 변수가 저장 될 때 변수 스탠드가 저장됩니다.
이 답변이 당신에게 도움이되기를 바랍니다. 파이썬, "nofollow"> 어려운 방법을 배우십시오 나에게 유용한 무료 HTML 버전이있는 책의 사이트입니다.