在我的代码中,我有嵌套列表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
更改时保持静态。我怎样才能做到这一点?
答案 0 :(得分:2)
from copy import deepcopy
pastmoves.append(deepcopy(gamelist))
答案 1 :(得分:1)
最简单的方法就是使用copy.deepcopy()
在嵌套列表上进行深层复制。
答案 2 :(得分:1)
作为copy.deepcopy()
的替代方法,您可以通过列表理解来实现此目的:
pastmoves.append([inner[:] for inner in gamelist])
请注意,这只适用于一个嵌套级别,如果您有任意嵌套列表,那么copy.deepcopy()
绝对是可行的方法。
答案 3 :(得分:0)
简单:pastmoves.append( list(gamelist[:]) )
现在每次都会生成新对象