2010-05-26 4 views
1

난 파이 게임 스프라이트 하위에있어서, 그러한 정의가 :파이썬 : 메소드가 추가 된 매개 변수와 다르게 작동하는 이유는 무엇입니까?

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) 

왜이 일하지 않습니다?

답변

3

당신은 "깨진"하지만 주요 차이점은 당신이 당신의 두 번째 버전이

speed_x = -speed_x 

는 만 지역 변수 (인수가 지역 변수 변화하고 있다는 것입니다 방법을 설명하지 않습니다!) speed_x이므로 변경된 값은 유지되지 않습니다. 미래의 방법은 여기 self로 액세스되는 개체에 호출의 첫 번째 버전에서

,
self.move = -self.move 

self (특히 그 attriubtes 중 하나)과 변경을 변경 않는다 "지속".

그냥 맨손으로 이름 사이에 많은 중요한 차이점 중 하나 (speed_x를 같은) 자격을 갖춘 이름 (라인 self.move), 그리고, 나는 생각한다, (하드 당신을 물고 무슨 당신은 방법 말을하지 않음으로써 추측 할 수 있으므로 두 번째 버전은 기대치를 충족시키지 못하고 있음).

+0

아, 그건 의미가 있습니다. 감사. 물체 (이미지)가 화면의 가장자리에 부딪 칠 때마다 방향을 바꾸는 대신 이미지가 그면에 붙어 있습니다. 그것이 깨진 방법입니다. – SteveStifler

+0

@ 스티브, 언제나 환영합니다. 언제나 도움이되기를 기원합니다! –

1

오프셋을 self.move에 다시 저장하지 않습니다. 당신은 당신의 코드의 두 번째 버전을 사용하려면

1

이 줄을 추가하십시오 :

self.move = speed_x 

를 함수의 아래쪽에.

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) 

참고 :이 답변 walk를 호출 할 때 self.move 항상 업데이트되지 않을 것을 가정합니다.이 가정이 거짓이고 이 실행될 때마다 self.move을 실제로 업데이트해야한다면 Xavier Ho의 대답을 대신 사용해야합니다.

+0

나는 화려한 디자인, 또는 끔찍한 디자인을보고 있는지 잘 모르겠다. 전달 된 값을 반환 한 다음 매개 변수를 자체에 할당해야하는 이유는 무엇입니까? –

+0

나는이 함수가'self.move'가 아닌 다른 값을 위해 사용되고이 함수의 작업 중 하나가 건네받은 인수의 값을 갱신하는 것이라는 가정하에이 대답을하고있다. Python에서는 불변 인 수의 값을 업데이트 할 수 없으므로,이 인자는 메소드 외부에서 업데이트해야합니다. 두 번째 주장이'walk'에 상관없이'self.move'가 실제로 업데이트되어야한다면 내 대답은 완전히 부적절합니다 (당신의 대답이 가정하는 것처럼). –