Python:为什么添加参数后方法的行为会有所不同?

标签 python oop pygame

我在 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/

相关文章:

扩展类 __construct 上的 PHP OOP 更新 protected 字符串

python - 隐藏pygame显示

java - 这段代码可以用更好更灵活的方式编写吗?

javascript - 这些原型(prototype)声明有什么区别?

python - 从组中删除 Sprite

class - 如何通过 while/for 循环创建一个类的多个精确实例(以访问它们的属性)?

python - 在 url 错误中搜索单词

python - 属性错误: 'WSGIRequest' object has no attribute 'status_code'

python - Locality Sensitive Hashing - 寻找 R 的概率和值

python - Python中函数参数顺序的最佳实践