Muss global verwendet werden, um auf die LOCAL-Variable zuzugreifen (keine Ahnung warum) Python;Kivy

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

  •  13-12-2019
  •  | 
  •  

Frage

Ich habe kürzlich Kivy heruntergeladen, da es mir die verständlichsten Tutorials, Dokumentationen usw. bietet.Ich habe Pygame und Cocos ausprobiert, konnte aber nie eine Grundlage finden, und mit Kivy war es einfach.

Hier ist also mein Problem: Ich habe ein Pong-Spiel erstellt und versuche, das Spiel anzuhalten, indem ich den Pong-Ball anhalte und ihn dann erneut starte, wenn er nicht pausiert ist (indem ich seine Geschwindigkeit ändere).

Hier ist mein Code:

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   

Wie Sie in den Kommentaren sehen können, werde ich vor dem Zuweisungsfehler referenziert, wenn ich nicht global verwende.Aber es ist eine lokale Variable, ich verstehe nicht, warum das passiert.

Hat jemand irgendwelche Ideen?Danke?

Bearbeiten:Um sicherzustellen, dass sich alle über meine Absichten im Klaren sind, möchte ich KEIN Global verwenden, aber nur so wird es funktionieren.Ich würde es vorziehen, keine Globals zu verwenden.

War es hilfreich?

Lösung

Wenn Sie den Einrückungsfehler erneut beheben, werden Sie Folgendes sehen:Sie können sehen, dass:

  1. die Flucht escape sollte allerdings ohne das Global funktionieren tempBallVelocity wird als lokale Variable betrachtet.Wenn Sie eine globale Variable ändern möchten, müssen Sie die globale Deklaration hinzufügen, um Python dies mitzuteilen tempBallVelocity ist nicht lokal, sondern global.

  2. Im zweiten Fall tempBallVelocity wird nicht lokal initialisiert, wenn Sie den Escape-Block nicht eingeben und kann daher nicht als lokaler verwendet werden RWert.In diesem Fall sollte Python nach der Variablen außerhalb der Klasse suchen.Ist tempBallVelocity wirklich eine globale Variable?

Anmerkung:Wenn die Fälle exklusiv sind, sollten Sie verwenden elif anstatt if für den zweiten Fall.

Andere Tipps

Ihr Code innerhalb der Funktion ist nicht eingerückt. Ist das nur ein Kopierfehler?Wenn nicht, frage ich mich, warum Sie keine Fehlermeldung erhalten.

Bearbeiten:Ok, es ist einfach, die Variable festzulegen tempBallVelocity wenn Sie die Funktion mit aufrufen 'escape' aber dann wird die Funktion beendet und Sie verlieren die Variable.Wenn Sie es dann mit „Backtick“ aufrufen, haben Sie die Variable nicht gesetzt tempBallVelocity Dennoch wäre die beste Lösung wahrscheinlich:self.tempBallVelocity = self.ball.velocity.

Jedes Mal, wenn Sie eine Variable in einem identierten Codeblock einstellen, wird die Variable zerstört, sobald Sie aus diesem Block herausgekommen sind, wieder in die vorherige Identifizierung;

wenn Sie schreiben

generasacodicetagpre.

In einem riesigen Skript handelt Python die Foo-Variable nur, während es die IF-Anweisung 'innen' 'innen' ist, und sobald er es endet, ist Foo völlig vergessen, um die Dinge schneller zu machen, es ist verstanden, dass, wenn Sie das einstellen Variable in einer Anweisung verwenden Sie es nur in dieser Anweisung.

Wenn Sie so etwas tun wollten

generasacodicetagpre.

Sie müssen die Foo-Variable außerhalb der 'if' -Anstellungen einstellen

generasacodicetagpre.

oder Sie können es auch tun, indem Sie foo als globale Variable einstellen, sodass sie nicht zerstört wurde, wenn Sie außerhalb der IF-Anweisung

erfahren generasacodicetagpre.

Das kann jedoch unnötig und in den meisten Zirkumstanzen unnötig sein, oder sogar problematisch, wenn Sie mit allen globalen Größen, so dass Sie nur einmal verwenden, wenn Sie nur einmal verwenden, wenn Sie nur einmal auf dem Speicher Ihres Geräts auf dem Programm Ihres Geräts verwendet werden.

Jetzt schreiben Sie eine Klasse, so dass der richtige Weg, um das zu tun, was Sie tun würden (aus meiner Sicht), um die "Tempballvelocity" -Variable in der Klasse wie dieses

zu speichern. generasacodicetagpre.

Es sieht so aus, als ob es nicht die Regel respektiert, die ich Ihnen gerade gesagt habe, aber das, was hier ist, ist das, wenn Sie "self.tempballvelocity= ...", die Info in sich selbst speichern, die die Verknüpfung zu Das Ponggame-Objekt, das Sie instantieren, um das Spiel auszuführen, das diese Methode ausführt, sodass die Variable dort gespeichert ist, wenn Sie die Methode herausholen.

Ich hoffe, diese Antwort ist für Sie hilfreich, Sie sollten ein solides Wissen über Python, Python, den harten Weg ist ein Standort eines Buches mit einer kostenlosen HTML-Version, die für mich nützlich war.

Sie sehen! : D

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top