python-2.7 – python list.append() – 输出不一致

我创建了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
点赞