Python:为什么方法在添加参数时表现不同?

时间:2010-05-26 03:29:51

标签: 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)

为什么这不起作用?

4 个答案:

答案 0 :(得分:3)

你没有解释它是如何“破碎”的,但主要区别在于

speed_x = -speed_x
您在第二个版本中的

仅更改 local 变量(参数是局部变量!)speed_x,因此更改后的值不会保留。

在第一个版本中,

self.move = -self.move 

确实改变了self(特别是其中一个attriubtes),并且对将来作为self访问的对象的未来方法调用中的“更改”仍然存在。

裸名称(例如speed_x)和限定名称(行self.move)之间的众多关键差异中的一个,而且,我怀疑,这里有什么东西咬你(很难你可能会这样做)不要说如何第二个版本没有达到你的期望。)

答案 1 :(得分:1)

你不会将偏移量存回到self.move。

答案 2 :(得分:1)

如果您想使用代码的第二个版本,请尝试添加以下行:

    self.move = speed_x

在你的功能的底部。

答案 3 :(得分:1)

正如其他人所说,您并未在新代码中更改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实际上应该更新,那么你应该使用Xavier Ho的答案。