Python列表中的可变对象的ID

时间:2017-01-23 10:48:48

标签: python python-2.7 list

我一直在Python中使用[Value] * Count表示法来初始化列表。例如,[False] * 3导致创建列表[False, False False]。我尝试使用相同的表示法来初始化列表列表。

>>>a = [[0] * 2] * 3
>>>print a
[[0, 0], [0, 0], [0, 0]]
>>>a[0][1] = 23
>>>print a
[[0, 23], [0, 23], [0, 23]]
>>>id(a[0])
139978350226680
>>>id(a[1])
139978350226680
>>>id(a[2])
139978350226680

正如我们所看到的,a的元素引用单个列表三次而不是引用三个不同的列表。 1.为什么会这样? 2.初始化列表列表的正确方法是什么?

之前的答案中已经指出了相同的行为:https://stackoverflow.com/a/13382804/4716199

1 个答案:

答案 0 :(得分:1)

*运营商在列表中的行为:不制作副本,但复制参考。这是有道理的,因为它通常甚至没有定义如何制作副本,因此Python只能复制引用,因为它是每个对象唯一的东西。

如果您想构建新列表,可以使用list comprehension:

a = [[0] * 2 for _ in range(3)]

一般情况下,如果列表包含可变对象,则使用* 不良做法

对于boolstr这样的不可变对象,这可行,因为不能对象本身,但是在结果数组上。在您的示例中,您使用了链式索引,因此您可以修改内部列表。