我一直在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
答案 0 :(得分:1)
*
运营商在列表中的行为:不制作副本,但复制参考。这是有道理的,因为它通常甚至没有定义如何制作副本,因此Python只能复制引用,因为它是每个对象唯一的东西。
如果您想构建新列表,可以使用list comprehension:
a = [[0] * 2 for _ in range(3)]
一般情况下,如果列表包含可变对象,则使用*
不良做法。
对于bool
和str
这样的不可变对象,这可行,因为不能对象本身,但是在结果数组上。在您的示例中,您使用了链式索引,因此您可以修改内部列表。