乘法数组以制作矩阵会产生意想不到的结果

时间:2014-10-28 06:11:53

标签: python

假设我有这段代码:

dim = 3
eye =  [[0] * dim] * dim

它是列表,我检查了

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

现在,如果我这样做,我会得到:

eye[1][2] = 1
eye
[[0, 0, 1], [0, 0, 1], [0, 0, 1]]

但是,如果我手动输入此表达式,上面的代码按预期工作:

eye2=[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
eye2[1][2] = 1
eye2
[[0, 0, 0], [0, 0, 1], [0, 0, 0]]

两者有什么区别?

更新:感谢所有解释,假设我有以下代码:

a = [0]
type(a)
b = a * 3  # or b = [[0] *3]

所以,b持有对a的3个引用。我希望改变b [0]或b [1]或b [2]会改变所有3个元素 但是这段代码显示了正常行为,为什么会这样?

b[1] = 3
b
[0, 3, 0]

3 个答案:

答案 0 :(得分:1)

任何数组条目都是内存地址的标签,当你用变量将它复数时,实际上你会在数组中创建一个指向3宫殿的指针!你可以用列表理解来解决这个问题,如下所示:

Matrix = [[0 for x in xrange(3)] for x in xrange(3)]

答案 1 :(得分:0)

dim = 3
eye =  [[0] * dim] * dim

它制作相同的副本,如果你在一个地方改变它将被反映到所有

答案 2 :(得分:0)

dim = 3
eye =  [[0] * dim] * dim
print id(eye[0])
print id(eye[1])
print id(eye[2])

输出继电器: -

139834251065392
139834251065392
139834251065392

所以,当你在做eye = [[0] * dim] * dim时,它实际上是在恢复 将三个list退回到eye的同一个对象。

而在其他情况下

eye2=[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
print id(eye2[1])
print id(eye2[2])
print id(eye2[0])

输出中: -

139863345170480
139863260058256
139863260067240

每次参考ID都不同。