2012-07-28 2 views
0

최근 Kivy를 다운로드 받았는데 파이 게임과 코코스를 사용해 보았지만 결코 기초를 얻을 수 없었습니다. Kivy를 사용하면 쉽게 이해할 수있었습니다.LOCAL 변수에 액세스하려면 전역 변수를 사용해야합니다 (이유는 없습니다). python; Kivy

내 문제는, 나는 탁구 게임을 만들었고, 탁구 공을 멈추고 일시 중지가 해제되면 (속도를 변경하여) 게임을 다시 시작하려고합니다. 당신이 코멘트에서 볼 수 있듯이 나는 글로벌 사용하지 않으면, 내가 할당 오류 전에 참조 얻을

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 

:

여기 내 코드입니다. 하지만 그것은 지역 변수입니다. 왜 이런 일이 일어나고 있는지 이해할 수 없습니다.

누구든지 아이디어가 있습니까? 감사?

편집 : 모든 사람이 내 의도에서 분명히 보이는지 확인하기 위해 전 세계적으로 사용하고 싶지는 않지만 작동시킬 수있는 유일한 방법입니다. 전역 변수를 사용하지 않는 것이 좋습니다.

답변

1

다시 당신이 표시됩니다 당신은 그것을 볼 수 있습니다

  1. 탈출 escape 글로벌없이 작동하지만 tempBallVelocity는 로컬 변수로 간주됩니다. 전역 변수를 수정하려면 전역 선언을 추가하여 파이썬에 tempBallVelocity이 로컬이 아니라 전역임을 알릴 필요가 있습니다.

  2. 두 번째 경우, 이스케이프 블록을 입력하지 않으면 로컬 RValue으로 사용할 수 없으면 tempBallVelocity이 로컬로 초기화되지 않습니다. 이 경우 파이썬은 클래스 외부의 변수를 찾아야한다. tempBallVelocity은 실제로 글로벌 변수입니까?

발언 : 사례가 독점하는 경우 두 번째 경우에 elif 대신 if을 사용해야합니다.

+0

안녕하세요, 답변 주셔서 감사합니다. 'tempballVelocity'는 글로벌이 아닌 경우 작동하도록 설정할 수 없기 때문에 글로벌입니다. 나는 두 번째''if''를'elif'로 변경하고 전역을 제거했지만 문제는 남아 있습니다. 당신이 말하는 것은 .. if 문 안에서'tempBallVelocity'를 생성하기 때문에 if 문이 완료되면 삭제됩니다. 그렇다면이 문제를 어떻게 해결할 수 있는지 알고 계십니까? 메서드 외부에서'tempBallVelocity'를 생성하여 매개 변수로 전달하려고 시도했지만'_on_keyboard_down'은 5 개의 인수 만 취할 수 있습니다. 따라서이 메서드는 작동하지 않습니다. 어떤 아이디어? – Anteara

+0

예, 변수가 블록 외부에서 더 이상 액세스 할 수 없습니다. 첫 번째'if' 전에'tempBallVelocity = 0'을 추가하십시오. 변수를 호출간에 영속적으로 유지하려면'self.tempBallVelocity'를 사용하여 인스턴스 변수로 만들고'__init__' 함수에서 초기화해야합니다. – Thelvyn

+0

Wonderful, 전자는 효과가 없었지만 후자는 효과가있었습니다. 고맙습니다, 고마워요. 이제는 하나의 버튼 만 사용하여 일시 중지 및 일시 중지 해제 작업을 시도한 다음 해보십시오. 중첩 if 문을 사용하여 시도했지만, 첫 번째 if 문이 실행되고 'paused' ='true '가 활성화되지만 NEXT if 문은 일시 중지되었는지 검사하고에서 일시 중지합니다. 정확한 시간. while 루프를 사용해 보았지만 같은 일이 발생합니다. 새로운 질문을하거나 기존 질문을 업데이트하는 것이 현명하다고 생각하십니까? – Anteara

1

함수 내부의 코드는 들여 쓰여 있지 않습니다. 단지 복사 실수입니까? 그렇지 않다면 나는 왜 당신이 실수를하지 않는지 궁금해.

편집 : 'escape'으로 함수를 호출하면 쉽게 변수 tempBallVelocity을 설정하지만 함수가 종료되고 변수가 해제됩니다. 그런 다음 '역행 (backtick)'이라고하면 변수 tempBallVelocity을 아직 설정하지 않았으므로 가장 좋은 해결책은 self.tempBallVelocity = self.ball.velocity입니다. 당신이 들여 쓰기 오류를 수정하는 경우

+0

예, 복사 실수였습니다. 들여 쓰기를 언급하면 ​​질문의 형식이 수정되었습니다. – Anteara

0

식별 된 코드 블록 안에 변수를 설정할 때마다 변수는 해당 블록에서 벗어나 이전의 식별자로 다시 파괴됩니다. 이 문 경우 '내부'의 동안 거대한 스크립트 내부

if True: 
    foo = 'foo value, which is a string (?)' 
    print foo 

작성하는 경우

는, 파이썬은 푸 변수를 처리하고 그것을 종료하고 출소 후, foo는 완전히하기 위해 잊어 변수를 문장 내에 설정하면, 그 문장 내에서만 변수를 사용한다는 것을 이해할 수 있습니다.당신은 당신은 '만약'문

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' 

외부 foo는 변수를 설정해야 할 것이

if True: 
    foo = 'foo value' 

# Right now foo has been trashed 

if True: 
    print foo 
    # Raises an error 

같은 것을하고 싶었다 또는 당신은 또한 foo를 설정하여 그것을 할 수 있다면

전역 변수로서 'if'문 밖에서 벗어나면 파괴되지 않습니다.

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 

그러나 그 mA 대부분의 회람에서는 불필요하고 혼란 스럽거나 모든 것을 전역으로 만들기 시작하면 문제가 될 수 있습니다. 따라서 프로그램을 실행하는 동안 기기의 메모리에서 쓸모없이 사용되는 변수 만 사용할 수 있습니다.

지금 당신은 클래스를 작성하는, 그래서 올바른 방법이

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 

같은 클래스에서 스토리지에 당신이 (내 관점에서) 될 일을 무슨 'tempBallVelocity'변수를 할 그것은 내가 방금 말한 규칙을 존중하지 않는 것처럼 보입니다.하지만 여기에있는 것은 'self.tempBallVelocity = ...'라고 쓰면 PongGame 객체의 바로 가기 인 self의 정보를 저장하고 있다는 것입니다 당신은 그 메소드를 실행할 게임을 실행하기 위해 인스턴스화 할 것이므로 메소드를 얻을 때 변수가 거기에 저장됩니다.

이 답변이 도움이되기를 바랍니다. Learn Python The Hard Way은 (는) 유용한 무료 HTML 버전이 포함 된 책의 사이트입니다.

보자! : D

관련 문제