【发布时间】:2012-03-04 11:41:08
【问题描述】:
我有一个关于 Python 列表的小问题:
为什么会这样?
x = [[]] * 4
x[0].append('x') -> [['x'], ['x'], ['x'], ['x']]
【问题讨论】:
-
因为您要复制同一个列表四次。而且由于在您的列表中有 4 个列表都指向相同的内存空间,如果您修改其中一个,更改将影响所有。
我有一个关于 Python 列表的小问题:
为什么会这样?
x = [[]] * 4
x[0].append('x') -> [['x'], ['x'], ['x'], ['x']]
【问题讨论】:
[] 的同一个实例被复制了,所以当您附加到第一个 'x' 时,实际上是将其附加到所有实例 - 因为它们都是同一个对象!
正确的做法是每次显式创建一个新的列表实例:
x = [[] for _ in range(4)]
【讨论】:
[[]] * 4 创建了一个列表,其中包含对同一个 [] 实例的四个引用。
[[]] * 4 看起来是节省一些打字的好方法,但它通过仅创建两个真实列表和 3 个引用而在后面咬人,这并不那么明显。我曾经也这样做过,但从现在开始,我将只使用此处建议的列表理解。好吧,对于这么小的列表[[],[],[],[]] 也可以。无需使用[[]] * 4 炫耀。 :)