列表中有乘法和无副本之间的差异

问题描述 投票:0回答:1

两者之间的区别有解释器吗?

aL, bL = [[], []]
xL, yL = [[]] * 2

表面上,它们应该是相同的。

[[], []] == [[]] * 2
True

但是他们的行为有所不同。

aL.append("a")
xL.append("x")
bL
[]
yL
['x']
python
1个回答
0
投票
>>> [[]] * 2 == [[], []] # True

>>> a1, b1 = [[], []]
>>> id(a1) # 4425627680
>>> id(b1) # 4425627760

>>> a2, b2 = [[]] * 2
>>> id(a2) # 4424875616
>>> id(b2) # 4424875616

[当您使用*表达式生成列表列表时,Python正在复制[[]]的内部对象,并复制其引用。因此,进行[[]] * 2时,将得到一个列表列表,其中内部列表中的all是同一对象。如果您仍然感到困惑,建议您检查一下此post

现在为什么[[]] * 2 == [[], []]为True,这很容易观察:

>>> bool([[], []]) # True
>>> bool([[]] * 2) # True
>>> bool([]) # False

内部包含任何内容的列表的总值为True,因此您正在执行的True == True当然是True

© www.soinside.com 2019 - 2024. All rights reserved.