Python:将嵌套列表的副本追加到列表中

0 投票
4 回答
2317 浏览
提问于 2025-04-17 17:04

在我的代码中,我有一个嵌套列表叫做 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))

撰写回答