Python:将嵌套列表的副本追加到列表中
在我的代码中,我有一个嵌套列表叫做 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'], []]]
在每次连续移动后,内容会继续更新。
我的问题是,虽然 gamelist
被复制了,但里面的嵌套列表并没有被复制,所以在进行了两次移动后, pastmoves
看起来是这样的:
[[['3'], ['2', '1'], []], [['3'], ['2', '1'], []]]
我希望能让所有最底层的值也成为副本,并且在 gamelist
变化时保持不变。我该怎么做呢?
4 个回答
1
除了使用 copy.deepcopy()
之外,这里有一种使用列表推导的方法:
pastmoves.append([inner[:] for inner in gamelist])
请注意,这种方法只适用于一层嵌套的情况。如果你的列表有多层嵌套,那么使用 copy.deepcopy()
绝对是更好的选择。
1
最简单的方法就是用 copy.deepcopy()
来对嵌套列表进行深拷贝。
2
当然可以!请看下面的内容:
在编程中,有时候我们需要让程序在特定的条件下执行某些操作。比如说,如果你想要在用户输入一个数字后,程序能够判断这个数字是正数、负数还是零,这就是一个条件判断的例子。
条件判断通常用“如果”这个词来表示。比如说:“如果这个数字大于零,那么就打印‘这是一个正数’。”这样,程序就能根据用户输入的数字来决定要做什么。
在编程语言中,条件判断的语法可能会有所不同,但基本的逻辑是相似的。你只需要记住,条件判断就是让程序根据不同的情况做出不同的反应。
希望这个解释能帮助你更好地理解条件判断的概念!
from copy import deepcopy
pastmoves.append(deepcopy(gamelist))