를 사용해야 합 글로벌 액세스하는 지역 변수(왜)python;고급 프로그래밍

StackOverflow https://stackoverflow.com//questions/11700648

  •  13-12-2019
  •  | 
  •  

문제

나는 최근에 다운로드 고급 프로그래밍으로 그것이 내게 가장 이해할 수 있는 튜토리얼 문서,등등.해봤 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.

도움이 되었습니까?

해결책

당신의 들여쓰기에 오류가 다시 당신이 볼 것이다: 당신이 볼 수 있는:

  1. 탈출 escape 없이 작동 글로벌 그러나, tempBallVelocity 으로 간주됩니다 지역 변수입니다.수정하려면 전역 변수를 추가할 필요가 세계 선언을 말하는 파이썬 tempBallVelocity 지 않은 로컬 하지만 글로벌입니다.

  2. 두 번째 경우에, tempBallVelocity 지 않은 로컬로 초기화되지 않는 경우에 입력하 탈출을 차단하고 따라서으로 사용할 수 없습니다 지역 번씩만.이 경우에는 파이썬 찾아야 한다는 변수의 외부 클래스입니다.가 tempBallVelocity 정말 글로벌 변?

말:하는 경우에는 독점적인 사용해야 합니다 elifif 두번째 경우.

다른 팁

귀하의 코드가 내부에는 기능을 들여쓰지 않습는 그냥 복사하는 실수를 했을까요?하지 않는 경우 왜 당신을 얻지 못한 오류가 있습니다.

편집: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 버전이있는 책의 사이트입니다.

보자! : D

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top