Python 构造二维列表

Python 构造二维列表,python,list,Python,List,可能重复: 我尝试使用以下语句在python中创建一个列表 S = [0] * 10 结果很好 S[0] = 1 S [1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 但是当我试图生成一个二维列表时,发生了一些意想不到的事情 S = [[0] * 10] * 2 S[0][1] = 1 S[0][2] = 2 S [[0, 1, 2, 0, 0, 0, 0, 0, 0, 0], [0, 1, 2, 0, 0, 0, 0, 0, 0, 0]] 请注意S[0]==S[1] 为什么

可能重复:

我尝试使用以下语句在python中创建一个列表

S = [0] * 10
结果很好

S[0] = 1
S
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
但是当我试图生成一个二维列表时,发生了一些意想不到的事情

S = [[0] * 10] * 2
S[0][1] = 1
S[0][2] = 2
S
[[0, 1, 2, 0, 0, 0, 0, 0, 0, 0], [0, 1, 2, 0, 0, 0, 0, 0, 0, 0]]
请注意
S[0]==S[1]

为什么?


顺便问一下,这是构建二维阵列的最佳方法吗?如果没有,什么是最好的?

因为您告诉它要制作同一可变列表的两个副本

S = [[0] * 10 for x in range(2)]

因为你让它复制两份相同的可变列表

S = [[0] * 10 for x in range(2)]

S=[[0]*10]*2表示[[0]*10]的两个引用,因此当您更改其中一个时,另一个也会更改。顺便说一句,[0]*10很好的原因是:对一个数字的引用。

S=[[0]*10]*2表示[[0]*10]的两个引用,所以当您更改其中一个时,另一个也会更改。顺便问一下,[0]的原因是什么*10可以是:一个数字的引用。

它实际上在引用中解释过(注2)它实际上在引用中解释过(注2),但为什么我创建1d列表时它不复制10份[0]?@ymfoi-事实上,它是。但是,当您指定给列表项(
S[0]=
)时,该项将替换为新对象。如果您有一个2D列表,则赋值
S[0][1]=
首先从第一个列表中获取项目,然后才替换第二个列表中的项目。由于第一个列表中的所有项目都引用同一个对象,因此可以在所有项目中看到赋值结果。但为什么在我创建1d列表时,它不复制[0]10个副本呢?@ymfoi-事实上,它是这样做的。但是,当您指定给列表项(
S[0]=
)时,该项将替换为新对象。如果您有一个2D列表,则赋值
S[0][1]=
首先从第一个列表中获取项目,然后才替换第二个列表中的项目。由于第一个列表中的所有项都引用同一个对象,因此可以在所有项中看到赋值结果。