为什么我不能只更改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) ]