我创建了4个相同的列表L1,L2,L3,L4
>>> L0 = [[1]]
>>> L1 = [[1],[1]]
>>> L2 = [[1] for i in range(2)]
>>> L3 = L0 + L0
>>> L4 = [[1]] * 2
>>> L1
[[1], [1]]
>>> L2
[[1], [1]]
>>> L3
[[1], [1]]
>>> L4
[[1], [1]]
>>> L1 == L2 == L3 == L4
True
将list.append()应用于每个
中的第一个元素>>> L1[0].append(2)
>>> L2[0].append(2)
>>> L3[0].append(2)
>>> L4[0].append(2)
结果
>>> L1
[[1, 2], [1]]
>>> L2
[[1, 2], [1]]
>>> L3
[[1, 2], [1, 2]]
>>> L4
[[1, 2], [1, 2]]
有人可以解释一下L3和L4的输出吗?
答案 0 :(得分:1)
因为L3和L4实际上是引用,所以当你附加到L3 [0]和L4 [0]时,你实际上修改了它们所引用的内容。
答案 1 :(得分:1)
在所有这些情况下,列表包含引用到其中的其他列表。在L3
和L4
的情况下,它们是包含对单个其他列表的引用的列表(L0
L3
和L4
单个on-飞行清单[1]
)。
这就是[...]*2
语法的含义 - 将两个引用添加到基本列表中找到的条目。
当您追加时,您可以在其所有位置修改引用列表。
换句话说,当您修改L3[0]
时,您正在修改L3[1]
也引用的内容,因此稍后当您查询L3[1]
看起来是什么时,它会反映出现在已经修改过的版本,一直指的是它。
列表之间的平等是根据它们包含的有序元素的相等性来定义的。这递归地应用于列表列表,依此类推。所以在base中,你的相等性检查是一个关于列表中整数的问题,而不是关于实际列表对象实例的问题:
In [24]: x = [[1]]
In [25]: y = [[1]]
In [26]: x[0]
Out[26]: [1]
In [27]: y[0]
Out[27]: [1]
In [28]: x[0] == y[0]
Out[28]: True
In [29]: id(x[0])
Out[29]: 140728515456032
In [30]: id(y[0])
Out[30]: 140728514976728