如何在Python中不改变嵌套列表?

sbr*_*rm1 3 python list nested-lists python-3.x

我的代码:

 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
Run Code Online (Sandbox Code Playgroud)

应该发生什么:

>>> 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]]
Run Code Online (Sandbox Code Playgroud)

怎么了:

>>> 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]]
Run Code Online (Sandbox Code Playgroud)

它可能出错的地方: self.map = self.orig_map[:]

以上内容对单个列表有效(尝试和测试),但是,它似乎不适用于嵌套列表.

acd*_*cdr 5

通过说self.map = self.orig_map[:]你确实正在复制self.orig_map.但是,这是一个浅层副本,其中的元素self.map仍然是与其中的元素相同的对象self.orig_map.

你需要做的是在你的作品中做self.map一个深刻的复制.例如self.orig_map__init__

import copy
...
    self.map = copy.deepcopy(self.orig_map)
Run Code Online (Sandbox Code Playgroud)