マイコード:起こることになって何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つのリストに対して作業し(試してテストした)ただし、ネストされたリストでは機能しないようです。
は 'それをdeep_copy'。 (http://www.python-course.eu/deep_copy.php) –
あなたは '最後のステップでw.orig_map'を意味していましたか?[この参照してください]あなたは、この場合には、 'copy'モジュールの[' deepcopy'](https://docs.python.org/3/library/copy.html#copy.deepcopy)関数を使用することができます。 –
@IljaEveriläいいえ、私は 'w.map'を意味しました。しかし、そのステップでは、それらは等しい(値が賢明)が、異なるオブジェクトである必要があります。 – sbrm1