2013-07-29 5 views
1

나는 게임을 만들려고합니다. 이동하기 전에 플레이어의 위치를 ​​저장하려고합니다 (oldPosition). 나중에 사용할 수 있도록 저장합니다. 문제는 World.UpdateContents()가 실행될 때까지 oldPosition이 self.position과 함께 업데이트된다는 것입니다. self.position이 할 때 oldPosition을 변경하지 못하게하려면 어떻게해야합니까? 그들이 가리키는 것 -나중에 사용하기 위해 클래스 변수를 저장하려고합니다.

def Move(self, direction): 
    oldPosition = self.position 
    print oldPosition 
    if direction == "Up": 
     if self.position[0] - 1 in World.worldMap[0]: 
      self.position[0] -= 1 
    if direction == "Down": 
     if self.position[0] + 1 in World.worldMap[0]: 
      self.position[0] += 1 
    if direction == "Left": 
     if self.position[1] - 1 in World.worldMap[1]: 
      self.position[1] -= 1 
    if direction == "Right": 
     if self.position[1] + 1 in World.worldMap[1]: 
      self.position[1] += 1 
    print oldPosition 
    World.UpdateContents(world, oldPosition, self.position, self.icon) 

답변

1

속성 position는 목록, 당신은 당신이 그 목록에 대한 참조를 만들 oldPosition에 할당,하지만 당신은 position에 만들 어떤 수정도 oldPosition에 반영되는시기이다 같은 대상. 이 문제를 해결하기 위해 다음과 같이 시작 부분에 position의 복사본을 만들 :

oldPosition = self.position[:] 

이제 oldPosition 새로운, 다른 목록과는 position의 변경에 의해 영향을받지 않습니다.

+0

덕분으로 작동하고, 실질적으로 동일하다 : []

이, Y = X에 대응하기! 나는 그렇게 단순하지 않다고 생각했다. – wipeout4wh

0

self.position을 목록으로 가정하면 oldPosition = list (self.position)을 수행해야합니다. 이렇게하면 oldPosition은 self.position에 대한 참조 일뿐만 아니라 동일한 값을 가진 새로운 목록입니다.

0

오스카 로페즈 (Oscar Lopez)가 맞고 솔루션이 효과적입니다. 당신이 직면하고있는 문제는 파이썬의 목록이 변경 가능하다는 사실 때문입니다. 이것은 무엇을 의미 하는가?

글쎄, 정수 같은 변수가 아닌 변수가 있다고 가정 해 봅시다. 우리는

x = 3 
y = x 
x = x + 1 
print "x =", x, "y =", y 

, 예상대로 반환, 말, 수행 할 수 있습니다

라인이 "y를 = X"변수의 내부 정수 X의 사본을 만들기 때문에이 문제가 발생
x = 4 y = 3 

와이. x와 y는 선언 후에 변수 x에 묶이지 않기 때문에 우리가 원하는 것은 무엇이든 할 수 있습니다.

목록과 비슷한 작업을 수행하면 결과가 달라집니다.

x = [1,2,3] 
y = x 
x.append(4) 
print "x =", x, "y =", y 

x = [1,2,3,4] y = [1,2,3,4] 

는 그래서는 일이 갈까요? 리스트가 변경 가능하기 때문에 y를 x와 같게하면 y에 x의 복사본을 만드는 대신 y는 x가 가리키는 것과 동일한 데이터를 가리키게됩니다. 그래서 우리가 x를 바꿀 때, y는 마술처럼 변하게됩니다. 이것은 변수 y가 x가하는 것과 같은 것을 말하는 것이기 때문에 의미가 있습니다. 목록과 사전 같은 변경 가능한 유형이있는 x와 y 사이의 연결은 "y = x"라인을 초과하여 지속됩니다.

y = [] # y is a brand new list! 
for elem in x: 
    y.append(elem) 
관련 문제