【问题标题】:How to not mutate nested lists in Python?如何在 Python 中不改变嵌套列表?
【发布时间】:2017-05-30 13:01:00
【问题描述】:

我的代码:

 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[:]

上述方法对单个列表有效(经过试验和测试),但是,它似乎不适用于嵌套列表。

【问题讨论】:

  • deep_copy它。 See this
  • 您的意思是上一步中的w.orig_map 吗?在这种情况下,您可以使用 copy 模块的 deepcopy 函数。
  • @IljaEverilä 不,我的意思是w.map。然而,在这一步,它们应该是相等的(价值明智的)但是是不同的对象。
  • 对,错过了reset() 电话。
  • 取决于 self.orig_map 包含的确切内容,deepcopy 可能无法工作 stackoverflow.com/questions/1601269/…

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


【解决方案1】:

self.map = self.orig_map[:] 你确实是在复制self.orig_map。但是,这是一个副本,self.map 中的元素仍将是与self.orig_map 中的元素相同的对象。

您需要做的是在您的__init__ 中制作self.mapself.orig_map 副本。例如

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

【讨论】:

    【解决方案2】:

    你应该使用deepcopy

    import copy
    
    cop2 = copy.deepcopy(origin) 
    

    它会递归地复制你的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-11
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多