2017-05-30 8 views
3

マイコード:起こることになって何Pythonでネストされたリストを変更しない方法は?

class World: 
    def __init__(self, _map, pos): 
     self.orig_map = _map 
     self.map = self.orig_map[:] 
     self.orig_pos = pos 
     self.pos = list(self.orig_pos) 
    def reset(self): 
     self.map = self.orig_map[:] 
     self.pos = list(self.orig_pos) 
    def left(self): 
     if self.pos[1]>0: 
      self.pos[1]-=1 
    def right(self): 
     if not self.pos[1]+1>=len(self.map[0]): 
      self.pos[1]+=1 
    def up(self): 
     if self.pos[0]>0: 
      self.pos[0]-=1 
    def down(self): 
     if not self.pos[0]+1>=len(self.map): 
      self.pos[0]+=1 
    def eat(self): 
     if self.map[self.pos[0]][self.pos[1]]==1: 
      self.map[self.pos[0]][self.pos[1]]=0 
      return True 

>>> w=World([[0,0,0],[0,1,0],[0,0,0]],(0,0)) 
>>> w.right() 
>>> w.down() 
>>> w.eat() 
True 
>>> w.reset() 
>>> w.map 
>>> [[0, 0, 0], [0, 1, 0], [0, 0, 0]] 

何が起こる:それはおそらくうまくいかない

>>> w=World([[0,0,0],[0,1,0],[0,0,0]],(0,0)) 
>>> w.right() 
>>> w.down() 
>>> w.eat() 
True 
>>> w.reset() 
>>> w.map 
>>> [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 

を:self.map = self.orig_map[:]

上記のことだろう1つのリストに対して作業し(試してテストした)ただし、ネストされたリストでは機能しないようです。

+4

は 'それをdeep_copy'。 (http://www.python-course.eu/deep_copy.php) –

+0

あなたは '最後のステップでw.orig_map'を意味していましたか?[この参照してください]あなたは、この場合には、 'copy'モジュールの[' deepcopy'](https://docs.python.org/3/library/copy.html#copy.deepcopy)関数を使用することができます。 –

+0

@IljaEveriläいいえ、私は 'w.map'を意味しました。しかし、そのステップでは、それらは等しい(値が賢明)が、異なるオブジェクトである必要があります。 – sbrm1

答えて

5

self.map = self.orig_map[:]を言って、あなたは確かにself.orig_mapのコピーを作っています。しかし、これは浅いコピーであり、かつself.map内の要素はまだself.orig_map内の要素と同じオブジェクトになります。あなたが代わりに行うに必要なもの

はあなたの__init__self.orig_mapself.map深いコピーを作成することです。例えば。

import copy 
... 
    self.map = copy.deepcopy(self.orig_map) 
4

あなたはそれを再帰的にオブジェクトをコピーしますdeepcopy

import copy 

cop2 = copy.deepcopy(origin) 

を使用する必要があります。

関連する問題