假设我有这段代码:
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]
答案 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都不同。