Python列出了混乱

时间:2012-08-24 11:20:29

标签: python list

  

可能重复:
  “Least Astonishment” in Python: The Mutable Default Argument
  Python list confusion

我对Python中的列表列表感到有点困惑。我有这两个片段:

li1 = [['a'], ['a'], ['a']]
print li1
for i in range(0, len(li1)):
    li1[i] += [i]
print li1

li2 = [['a']] * 3
print li2
for i in range(0, len(li2)):
    li2[i] += [i]
print li2

创建后li1和li2是相同的,但是当我添加元素时,它们的行为不同:

[['a'], ['a'], ['a']]
[['a', 0], ['a', 1], ['a', 2]]
[['a'], ['a'], ['a']]
[['a', 0, 1, 2], ['a', 0, 1, 2], ['a', 0, 1, 2]]

有人可以解释诀窍的位置吗?

2 个答案:

答案 0 :(得分:5)

li2 = [['a']] * 3中,您创建一个包含三个列表元素的列表,但这些列表实际上是同一个对象。这意味着:当您修改li2[0]时,您还会修改li2[1]li2[2]

以下行实际上创建了一个列表,其中包含三个不同的列表对象:

li1 = [['a'], ['a'], ['a']]

在这种情况下,当您修改li1[0]时,您只需修改该列表。其他列表不受影响。这解释了为什么您在li1li2中获得了不同的列表。

答案 1 :(得分:1)

检查每个元素的id()值,这清楚地表明了他们行为的原因。

>>> li1 = [['a'], ['a'], ['a']]
>>> for x in li1:                  #different id()
    id(x)


145497484
145514156
145511500

id()的相同值:

>>> li1=['a']*3
>>> for x in li1:
    print id(x)


3078093024
3078093024
3078093024