我在 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)
为什么这行不通?
最佳答案
您没有解释它是如何“损坏”的,但主要区别在于
speed_x = -speed_x
您在第二个版本中拥有的,仅更改局部变量(参数是局部变量!)speed_x
,因此更改后的值不会持续存在。
在第一个版本中,
self.move = -self.move
确实改变了 self
(特别是它的一个属性)并且改变“持续”在未来对对象的方法调用中,该对象在这里作为 self
访问。
这只是裸名(如 speed_x
)和限定名(self.move
行)之间的众多主要区别之一,而且我怀疑,这里有什么问题(如果不说 第二个版本如何不符合您的预期,您可能很难猜测)。
关于Python:为什么添加参数后方法的行为会有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2909948/