2010-05-26 5 views
1

I ont une méthode dans une sous-classe Sprite Pygame, défini comme tel:Python: Pourquoi une méthode se comporte-t-elle différemment avec un paramètre ajouté?

def walk(self): 
    """move across screen""" 
    displacement = self.rect.move((self.move, 0)) 
    if self.rect.left < self.area.left or self.rect.right > self.area.right: 
     self.move = -self.move 
     displacement = self.rect.move((self.move, 0)) 
    self.rect = displacement 

I modifié, en ajoutant un paramètre speed_x, et maintenant le programme est cassé.

def walk(self, speed_x): 
    """move across screen""" 
    displacement = self.rect.move((speed_x, 0)) 
    if self.rect.left < self.area.left or self.rect.right > self.area.right: 
     speed_x = -speed_x 
     displacement = self.rect.move((speed_x, 0)) 
    self.rect = displacement 

Avant appelé la méthode comme ceci:

def update(self): 
     self.walk() 

Maintenant, je fais:

def update(self): 
    self.walk(self.move) 

Pourquoi pas ce travail?

Répondre

3

Vous n'explique pas comment il est « cassé », mais la principale différence est que

speed_x = -speed_x 

que vous avez dans votre deuxième version, ne change que les variables locales (arguments sont des variables locales! speed_x, afin que la valeur modifiée ne persiste pas.

Dans la première version,

self.move = -self.move 

ne modifie self (en particulier l'un de ses attriubtes) et l'altération « persiste » dans la future méthode fait appel à l'objet qui est ici accessible en tant que self.

Juste une des nombreuses différences clés entre les noms nus (comme speed_x) et les noms qualifiés (ligne self.move), et, je pense, ce qui vous mord ici (dur que vous pouvez faire deviner en ne disant comment la deuxième version échoue à vos attentes).

+0

Ah, c'est logique. Merci. Au lieu de changer de direction à chaque fois que l'objet (une image) atteint le bord de l'écran, l'image se coince de ce côté. C'est comme ça que ça a été cassé. – SteveStifler

+0

@Steve, de rien, toujours heureux de vous aider! –

1

Vous ne sauvegardez pas le décalage dans self.move.

1

Si vous souhaitez utiliser la deuxième version de votre code, essayez d'ajouter cette ligne:

self.move = speed_x 

Au bas de votre fonction.

1

Comme mentionné par d'autres, vous ne modifiez pas la valeur de self.move dans votre nouveau code. Je suppose que la raison pour laquelle vous avez modifié cette fonction était que vous puissiez réutiliser cette fonction pour des valeurs autres que self.move.

Si vous voulez être en mesure de passer différents arguments dans votre fonction et les modifier aussi bien, vous pouvez passer la valeur modifiée de speed_x retour en tant que valeur de retour:

def walk(self, speed_x): 
    """move across screen""" 
    displacement = self.rect.move((speed_x, 0)) 
    if self.rect.left < self.area.left or self.rect.right > self.area.right: 
     speed_x = -speed_x 
     displacement = self.rect.move((speed_x, 0)) 
    self.rect = displacement 
    return speed_x 

Et appeler la fonction comme celui-ci comme:

def update(self): 
    self.move = self.walk(self.move) 

note: Cette réponse suppose que self.move ne doit pas toujours être mis à jour lors de l'appel walk.Si cette hypothèse est fausse et que self.move doit être mise à jour à chaque fois que walk est exécuté, alors vous devriez plutôt utiliser la réponse de Xavier Ho.

+0

Je ne suis pas sûr si je vois un design brillant, ou un design horrible. Pourquoi retourneriez-vous la valeur transmise, puis devrez vous assigner le paramètre à lui-même? –

+0

Je base cette réponse sur l'hypothèse que cette fonction sera utilisée pour des valeurs autres que 'self.move' et que l'une des tâches de cette fonction est de mettre à jour la valeur de l'argument passé. Puisque mettre à jour la valeur d'un argument immutable n'est pas possible en Python, l'argument doit être mis à jour en dehors de la méthode. Ma réponse est complètement inappropriée si 'self.move' devrait en fait être mis à jour quel que soit le second argument' marcher '(comme je crois que votre réponse suppose). –

Questions connexes