Python: Почему метод ведет себя по-разному с добавленным параметром? - PullRequest
1 голос
/ 26 мая 2010

У меня есть метод в подклассе Pygame Sprite, определенный следующим образом:

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

Я изменил его, добавив параметр speed_x, и теперь программа не работает.

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

Прежде чем я назвал метод следующим образом:

def update(self):
        self.walk()

Теперь я делаю:

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

Почему это не работает?

Ответы [ 4 ]

3 голосов
/ 26 мая 2010

Вы не объясняете, как это "сломано", но главное отличие в том, что

speed_x = -speed_x

, который имеется во второй версии, только изменяет переменную local (аргументы - это локальные переменные!) speed_x, поэтому измененное значение не сохраняется.

В первой версии

self.move = -self.move 

действительно изменяет self (в частности, одну из его атрибутов), и это изменение сохраняется в будущих вызовах методов для объекта, к которому здесь обращаются как self.

Только одно из многих ключевых различий между голыми именами (например, speed_x) и квалифицированными именами (строка self.move), и, я подозреваю, что вас здесь кусает (как вы можете догадаться, не сказав как вторая версия не соответствует вашим ожиданиям).

1 голос
/ 26 мая 2010

Как уже упоминалось, вы не меняете значение self.move в своем новом коде. Я предполагаю, что причина, по которой вы изменили эту функцию, заключалась в том, что вы могли повторно использовать эту функцию для значений, отличных от self.move.

Если вы хотите иметь возможность передавать различные аргументы в вашу функцию и изменять их, вы можете передать измененное значение speed_x в качестве возвращаемого значения:

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

И вызовите такую ​​функцию как:

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

Примечание: В этом ответе предполагается, что self.move не всегда следует обновлять при вызове walk. Если это предположение неверно и self.move должен фактически обновляться каждый раз, когда запускается walk, вам следует вместо этого использовать ответ Ксавье Хо.

1 голос
/ 26 мая 2010

Если вы хотите использовать вторую версию своего кода, попробуйте добавить эту строку:

    self.move = speed_x

В нижней части вашей функции.

1 голос
/ 26 мая 2010

Вы не сохраняете смещение обратно в self.move.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...