ローカル変数にアクセスするには、Globalを使用しなければなりません(理由なし)Python。キビ

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

  •  13-12-2019
  •  | 
  •  

質問

最近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. Escape escapeはグローバルなしで動作する必要がありますが、tempBallVelocityはローカル変数と見なされます。グローバル変数を変更する場合は、tempBallVelocityがローカルではなくグローバルではないPythonに指示するためにグローバル宣言を追加する必要があります。

  2. 2番目のケースでは、エスケープブロックに入らず、したがってローカル rvalue 。この場合、Pythonはクラスの外側の変数を探すべきです。tempBallVelocityは実際にグローバル変数ですか?

  3. 備考:ケースが排他的な場合は、2番目のケースのtempBallVelocityの代わりにelifを使用する必要があります。

他のヒント

関数内のあなたのコードはインデントされていません、それは単なるコピーの間違いですか?もしそうでなければ私はなぜあなたがエラーを受けないのだろうか。

編集: OK、tempBallVelocityを使用して関数を呼び出すときに変数'escape'を設定するのは簡単ですが、その関数は終了し、変数を失います。次に「バックトック」でそれを呼び出すと、変数tempBallVelocityをまだ設定していません。最良の解決策はおそらく次のようになります。 self.tempBallVelocity = self.ball.velocity

識別されたコードブロック内に変数を設定するたびに、そのブロックから抜け出し、以前の識別に戻すと、変数が破壊されます。

を書いたら
if True:
    foo = 'foo value, which is a string (?)'
    print foo
.

巨大なスクリプト内では、Pythonはfoo変数のみを扱いながらIFステートメントを終了し、それを終了してから出たら、物事をより早くするために完全に忘れられている、それを設定した場合ステートメント内の変数は、そのステートメント内でのみ使用できます。

このようなことをしたいのなら

if True:
    foo = 'foo value'

# Right now foo has been trashed

if True:
    print foo
    # Raises an error
.

「if」ステートメントの外側に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'
.

またはあなたはまた、 "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オブジェクトは、そのメソッドを実行するときに変数がそこに記憶されています。

私はこの答えがあなたに役立つことを願っています、あなたはPython、 Pythonを学ぶ無料のHTMLバージョンがある本のサイトです。

お会いしましょう! :d

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top