Doit utiliser global pour accéder à la variable LOCAL (je ne sais pas pourquoi) python ;Kivy

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

  •  13-12-2019
  •  | 
  •  

Question

J'ai récemment téléchargé Kivy car il m'a fourni les tutoriels et la documentation les plus compréhensibles, etc.J'ai essayé Pygame et Cocos mais je n'ai jamais réussi à obtenir une base, et avec Kivy, cela a été facile.

Alors voici mon problème, j'ai créé un jeu de pong et j'essaie de mettre le jeu en pause en arrêtant la balle de pong, puis en la redémarrant lorsqu'elle n'est pas en pause (en changeant sa vitesse).

Voici mon 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   

Comme vous pouvez le voir dans les commentaires, si je n'utilise pas global, je suis référencé avant l'erreur d'affectation.Mais c'est une variable locale, je ne comprends pas pourquoi cela se produit.

Quelqu'un a des idées ?merci?

Modifier:Juste pour m'assurer que tout le monde est clair dans mes intentions, je ne veux PAS utiliser de global, mais c'est la seule façon dont cela fonctionnera.Je préférerais ne pas utiliser de variables globales.

Était-ce utile?

La solution

Si vous corrigez à nouveau l'erreur d'indentation, vous verrez que :Tu peux voir ça:

  1. l'évasion escape devrait fonctionner sans le global, cependant tempBallVelocity sera considérée comme une variable locale.Si vous souhaitez modifier une variable globale, vous devez ajouter la déclaration globale pour indiquer à Python que tempBallVelocity n’est pas local mais global.

  2. Dans le deuxième cas, tempBallVelocity n'est pas initialisé localement si vous n'entrez pas le bloc d'échappement et ne peut donc pas être utilisé comme local RValeur.Dans ce cas, Python doit rechercher la variable en dehors de la classe.Est tempBallVelocity vraiment une variable globale ?

remarque:si les cas sont exclusifs, vous devez utiliser elif au lieu de if pour le deuxième cas.

Autres conseils

Votre code à l’intérieur de la fonction n’est pas en retrait, est-ce juste une erreur de copie ?Sinon, je me demande pourquoi vous n'obtenez pas d'erreur.

Modifier:Ok, c'est simple, tu définis la variable tempBallVelocity lorsque vous appelez la fonction avec 'escape' mais ensuite la fonction se termine et vous perdez la variable.Si vous l'appelez ensuite avec 'backtick', vous n'avez pas défini la variable tempBallVelocity pourtant, la meilleure solution serait probablement :self.tempBallVelocity = self.ball.velocity.

Chaque fois que vous définissez une variable dans un bloc de code identifié, la variable est détruite une fois que vous êtes sorti de ce bloc, à l'identification précédente;

Si vous écrivez

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

à l'intérieur d'un script énorme, Python ne gère que la variable FOO alors qu'il est "à l'intérieur" la déclaration IF, et une fois qu'il l'extrait et sort, FOO est complètement oubliée afin de rendre les choses plus rapides, il est entendu que si vous définissez le Variable à l'intérieur d'une déclaration, vous n'utilisez que dans cette déclaration.

Si vous vouliez faire quelque chose comme ça

if True:
    foo = 'foo value'

# Right now foo has been trashed

if True:
    print foo
    # Raises an error

Vous devriez définir la variable FOO en dehors des déclarations "si"

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'

ou vous pouvez également le faire en définissant FOO comme une variable globale afin de ne pas être détruite une fois que vous êtes à l'extérieur de la déclaration "si"

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

Mais cela peut être irréprochable et déroutant dans la plupart des circonstances, voire problématique si vous commencez à rendre toutes les variables mondiales que vous utilisez uniquement une fois accumulée inutilement sur la mémoire de votre appareil pendant le programme.

À l'heure actuelle, vous écrivez une classe, de sorte que la bonne façon de faire ce que vous faites serait (de mon point de vue) au stockage de la variable 'TempballVelocity' dans la classe comme celle-ci

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   

On dirait que cela ne respecte pas la règle que je viens de vous dire, mais la chose ici est que lorsque vous écrivez 'self.tempballvelocity= ...' Vous stockez les informations en soi, qui est le raccourci vers L'objet PongGame vous instancerez pour exécuter le jeu, qui exécutera cette méthode, de sorte que la variable se situe sur place lorsque vous sortez la méthode.

J'espère que cette réponse vous est utile, vous devriez obtenir une connaissance plus solide sur Python, Apprendre Python la voie difficile est un site d'un livre avec une version HTML gratuite qui m'a été utile.

On se voit! : D

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top