我创建了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的输出吗?
最佳答案 在所有这些情况下,列表包含对其中其他列表的引用.在L3和L4的情况下,它们是由对单个其他列表的引用组成的列表(L3为L0,L4为单个动态列表[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