簡體   English   中英

Python:為什么帶有附加參數的方法的行為有所不同?

[英]Python: Why Does a Method Behave Differently with an Added Parameter?

我在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 (特別是其屬性之一),並且在將來的方法中更改“ persists”將在此調用作為self訪問的對象。

只是裸露的名字(例如之間的許多主要區別之一speed_x )和合格的名稱(線self.move ),並且,我懷疑,怎么在這里咬你(努力,你可以讓它通過不是說第二個版本是如何猜測達不到您的期望)。

您無需將偏移量存儲回self.move中。

如果要使用第二版代碼,請嘗試添加以下行:

    self.move = speed_x

在功能的底部。

正如其他人提到的那樣,您不會在新代碼中更改self.move的值。 我認為您修改此函數的原因是為了使您可以針對self.move以外的其他值重用此函數。

如果您希望能夠將不同的參數傳遞給函數並進行修改,則可以將speed_x的修改后的值作為返回值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)

注意:此答案假設在調用walk時,不應始終更新self.move 如果這個假設是錯誤的,並且實際上self.move應該在每次walk更新,那么您應該改用Xavier Ho的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM