可能重复:
“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]]
有人可以解释诀窍的位置吗?
答案 0 :(得分:5)
在li2 = [['a']] * 3
中,您创建一个包含三个列表元素的列表,但这些列表实际上是同一个对象。这意味着:当您修改li2[0]
时,您还会修改li2[1]
和li2[2]
。
以下行实际上创建了一个列表,其中包含三个不同的列表对象:
li1 = [['a'], ['a'], ['a']]
在这种情况下,当您修改li1[0]
时,您只需修改该列表。其他列表不受影响。这解释了为什么您在li1
和li2
中获得了不同的列表。
答案 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