【问题标题】:Python: append copy of nested list to list [duplicate]Python:将嵌套列表的副本附加到列表[重复]
【发布时间】:2013-02-10 22:01:13
【问题描述】:

在我的代码中,我有嵌套列表gamelist,定义为

gamelist = [['3'], ['2'], ['1']]

该程序的目的是将内部列表视为堆栈,将较小的元素附加到包含较大元素的堆栈或空堆栈中,在列表中上下扫动,而不是重复移动。理论上这个游戏应该去:

[['3'], ['2'], ['1']]
[['3'], ['2', '1'], []]
[['3', '1'], ['2'], []]
[['3', '1'], [], ['2']]

以此类推,直到列表从小到大排序。

为了检查当前的移动与之前的移动,我创建了pastmoves,它在每次移动后附加了gamelist 的副本。

pastmoves.append(gamelist[:])

所以pastmoves 应该是

[[['3'], ['2'], ['1']]]
[[['3'], ['2'], ['1'], [['3'], ['2', '1'], []]]

每次连续移动后以此类推。

我的问题是,当游戏列表被复制时,嵌套在其中的列表不是,pastmoves 在两次移动后看起来像这样:

[[['3'], ['2', '1'], []], [['3'], ['2', '1'], []]]

我想让所有底层值也都是副本,并在gamelist 更改时保持静态。我怎样才能做到这一点?

【问题讨论】:

    标签: python arrays list append nested


    【解决方案1】:
    from copy import deepcopy
    
    pastmoves.append(deepcopy(gamelist))
    

    【讨论】:

    • 我想我可能应该通读标准库。非常感谢您的帮助。
    【解决方案2】:

    最简单的方法就是使用copy.deepcopy() 对嵌套列表进行深拷贝。

    【讨论】:

      【解决方案3】:

      作为copy.deepcopy() 的替代方案,您可以通过以下方式使用列表理解来执行此操作:

      pastmoves.append([inner[:] for inner in gamelist])
      

      请注意,这仅适用于一级嵌套,如果您有任意嵌套列表,那么copy.deepcopy() 绝对是要走的路。

      【讨论】:

      • 返回了有趣的值。 pastmoves 读取 [<generator object <genexpr> at 0x026E2E18>]。我以前从未使用过列表推导,所以我不知道这里发生了什么。
      • 方括号是否包括在内?
      • 看来我忘记了。现在可以正常使用了,谢谢。
      【解决方案4】:

      简单:pastmoves.append( list(gamelist[:]) )

      现在每次都会生成新对象

      【讨论】:

      • 这导致了同样的问题,我不知道为什么。
      • list(gamelist) 会和gamelist[:] 做同样的事情,都是浅拷贝。 list(gamelist[:]) 只会做两次浅拷贝,结果的内部列表将与来自 gamelist 的列表具有相同的标识。
      • 我的测试显示了不同的结果:>>> a = [[1],[2],[3]] >>> b = list(a) >>> a [[1 ], [2], [3]] >>> b [[1], [2], [3]] >>> b[1]=[8] >>> a [[1], [2] , [3]] >>> b [[1], [8], [3]]
      猜你喜欢
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      • 2015-08-05
      • 2015-08-10
      相关资源
      最近更新 更多