-1

可能重复:
Python 中的“Least Astonishment”:可变默认参数
Python 列表混淆

我对 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]]

有人可以解释一下诀窍在哪里吗?

4

2 回答 2

5

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

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

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

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

于 2012-08-24T11:21:31.390 回答
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
于 2012-08-24T11:28:05.207 回答