如何在python中操作2d列表



我正在尝试替换2d列表中的元素。我有这个清单

[['0', '0', '0'],
['0', '0', '0'], 
['0', '0', '0']]

我想把第一行转换成1,1,1

这是我试过的

l = [["0"]*3]*3
for i in range(3):
l[0][i] = "1"

但我得到的是下面的输出,而不是

[['1', '1', '1'],
['1', '1', '1'], 
['1', '1', '1']]

为什么要将所有行转换为1?

我还试着插入一个类似的元素

l[1][1] = 1

这将每行的[1]元素覆盖为1,就像这个一样

[['0', 1, '0'], 
['0', 1, '0'], 
['0', 1, '0']]

我是犯了一个愚蠢的错误还是我的翻译有问题?

由于乘法运算,内部列表都是同一个对象。这与基本相同

inner = ["0"] * 3
outer = [inner, inner, inner]

当您现在更改inner(或outer的一个元素(时,您将更改它的所有引用。

如果你想生成一个具有独立元素的2D列表,我建议你理解列表:

[["0" for i in range(3)] for j in range (3)]

您的解释器不是问题所在。我认为你只是在错误地构建你的矩阵。您可以将矩阵的第一行更改为

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

for i in range(3):
matrix[0][i] = '1'

使用

l = [ [0]*3 for i in range(3)]

在代码中,它们都指向同一个对象。