[英]How to not mutate nested lists in 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[:]
以上內容對單個列表有效(嘗試和測試),但是,它似乎不適用於嵌套列表。
通過說self.map = self.orig_map[:]
你確實在制作self.orig_map
的副本。 但是,這是一個淺表副本, self.map
的元素仍然與self.orig_map
的元素self.orig_map
。
你需要做的,而不是什么是讓self.map
的深層副本self.orig_map
在你的__init__
。 例如
import copy
...
self.map = copy.deepcopy(self.orig_map)
你應該使用deepcopy
import copy
cop2 = copy.deepcopy(origin)
它將以遞歸方式復制您的對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.