python - 如何不改变 Python 中的嵌套列表?

标签 python list python-3.x nested-lists

我的代码:

 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.map self.orig_map深层副本在你的__init__ .例如

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

关于python - 如何不改变 Python 中的嵌套列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44263010/

相关文章:

python - 如何制作可调用命令 python 的列表?

python - 在 Django 模板 Django 中获取特定日期

string - Ocaml - 字符串到 (int*int*int) 列表

python - 用于创建工具架面板的 Blender 脚本没有给出任何结果

python - 如何将每 500 个文件移动到不同的文件夹中

python - 如何使用 3.x 模拟 2.x 的 lambda 参数元组解包?

python - 如何编写 python 代码来使用 blockdiag 包

java - java中生成随机数

java - 使用流交替混合两个列表

python - 将 SQLAlchemy 与引擎/连接而不是 session 一起使用是否是线程安全的?