为什么我不能只更改Python嵌套列表中的单个元素?


问题内容

这个问题已经在这里有了答案

列表更改列表意外地反映在子列表中 (16个答案)

2年前关闭。

我刚刚遇到了Python真正奇怪的东西:

>>> out=[[0]*3]*3
>>> out
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> out[0][1]
0
>>> out[0][1]=9
>>> out
[[0, 9, 0], [0, 9, 0], [0, 9, 0]]

好吧,显然,我想要的是:

[[0, 9, 0], [0, 0, 0], [0, 0, 0]]

不奇怪吗 我对Python不太熟悉,但是Python的直观行为总是给我留下深刻的印象。但是,这是怎么产生的呢?
…以及如何获得所需的东西?

谢谢!


问题答案:

确实,这是一个奇怪的行为,但这仅是因为*操作员制作了浅表副本,在您的情况下是[0, 0, 0]列表的浅表副本。您可以使用该id()函数来确保这些内部列表实际上是相同的:

out=[[0]*3]*3
id(out[0])
>>> 140503648365240
id(out[1])
>>> 140503648365240
id(out[2])
>>> 140503648365240

理解可用于创建 不同的 列表,如下所示:

out = [ [0]*3 for _ in range(3) ]