我正在尝试替换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)]
在代码中,它们都指向同一个对象。