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

时间:2014-09-21 18:45:08

标签: python-2.7

我创建了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的输出吗?

2 个答案:

答案 0 :(得分:1)

因为L3和L4实际上是引用,所以当你附加到L3 [0]和L4 [0]时,你实际上修改了它们所引用的内容。

答案 1 :(得分:1)

在所有这些情况下,列表包含引用到其中的其他列表。在L3L4的情况下,它们是包含对单个其他列表的引用的列表(L0 L3L4单个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