2013-02-25 81 views
0

在我的代码,我有嵌套列表gamelist,定义为的Python:追加嵌套列表的副本列出

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更改。我怎样才能做到这一点?

回答

2
from copy import deepcopy 

pastmoves.append(deepcopy(gamelist)) 
+1

我想我应该通过标准库可能读取。非常感谢您的帮助。 – user1576628 2013-02-25 17:15:16

1

最简单的方法就是使用copy.deepcopy()在嵌套列表上进行深层复制。

1

作为替代copy.deepcopy(),这里是你如何与列表理解这样做:

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

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

+0

有趣的价值返回。 'pastmoves'读取[[<发生器对象 at 0x026E2E18>]'。我从来没有使用过列表推导,所以我不知道这里发生了什么。 – user1576628 2013-02-25 17:26:00

+0

您是否包含方括号? – 2013-02-25 17:31:08

+0

看起来像我忘了。它现在工作正常,谢谢。 – user1576628 2013-02-25 17:33:23

0

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

现在每次有新对象将BEW产生

+0

这导致了同样的问题,我不知道为什么。 – user1576628 2013-02-25 17:20:40

+0

'list(gamelist)'将和'gamelist [:]'做同样的事情,都是浅拷贝。 'list(gamelist [:])'只会执行一次浅拷贝,并且结果的内部列表将与来自'gamelist'的列表具有相同的标识。 – 2013-02-25 17:42:24

+0

我的测试显示有点不同的结果: >>> a = [[1],[2],[3]] >>> b = list(a) >>> a [[1],[ [1],[3]] [b] [1],[3] 2],[3]] >>> b [[1],[8],[3]] – WBAR 2013-02-26 09:19:19