2013-07-29 30 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

謝謝!我不認爲這會很簡單。 – wipeout4wh

0

你需要做oldPosition = list(self.position),假定self.position是一個列表。這樣,oldPosition不僅是對self.position的引用,而且是具有相同值的新列表。

0

奧斯卡洛佩茲是對的,他的解決方案將工作。你面臨的問題是由於python中的列表是可變的。這是什麼意思?嗯,我們有一些不可變的變量,比如一個整數。我們可以做的,比如說,

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

,正如預期,返回:

x = 4 y = 3 

這是因爲行 「Y = X」 可變的內部產生的整數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的副本,python會使y指向x指向的相同數據。所以,當我們改變x時,y似乎隨着它發生了奇蹟般的變化,這是有道理的,因爲變量y指的是與x所做的相同的事情。 x和y之間的連接與像列表和字典這樣的可變類型持續在「y = x」行之外。

爲了解決這個問題,Y = X [:]的作品,這在本質上是一樣做

y = [] # y is a brand new list! 
for elem in x: 
    y.append(elem) 
相關問題