0

在我的代码中,我有嵌套列表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更改时保持静态。我怎样才能做到这一点?

4

4 回答 4

2
from copy import deepcopy

pastmoves.append(deepcopy(gamelist))
于 2013-02-25T17:10:23.397 回答
1

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

于 2013-02-25T17:10:34.687 回答
1

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

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

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

于 2013-02-25T17:11:55.300 回答
0

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

现在每次都会生成新对象

于 2013-02-25T17:13:47.603 回答