Python数组奇怪的行为?

时间:2016-06-24 16:21:50

标签: python arrays list append

任何人都可以解释为什么会这样吗?

案例1:

>>> a = [[0]] *3
>>> print a
[[0], [0], [0]]
>>> a[1].append(0)
>>> print a
[[0, 0], [0, 0], [0, 0]]

案例2:

>>> a = [[0],[0],[0]]
>>> print a
[[0], [0], [0]]
>>> a[1].append(0)
>>> print a
[[0], [0, 0], [0]]

为什么会这样?我期望情况1中数组的行为与情况2一样,但不是出于某种原因。

2 个答案:

答案 0 :(得分:3)

在第一种情况下,a中的三个元素实际上引用了相同的列表对象。你可以查看他们的身份证明:

>>> id(a[0])
4524132472
>>> id(a[1])
4524132472
>>> id(a[2])
4524132472

答案 1 :(得分:2)

在第一种情况下,您正在创建列表[0]并将其复制3次。这是重复三次的同一个对象。您应该只使用不可变类型

的星形

要在具有可变类型时避免此问题,请使用list comprehension:

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