[英]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.