Python列出了混乱

Ser*_*i G -1 python list

可能重复:
Python中的"最小惊讶":Mutable Default Argument
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
Run Code Online (Sandbox Code Playgroud)

创建后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]]
Run Code Online (Sandbox Code Playgroud)

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

Sim*_*ser 5

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

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

li1 = [['a'], ['a'], ['a']]
Run Code Online (Sandbox Code Playgroud)

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