嵌套列表自增量

时间:2014-04-15 22:41:42

标签: python list nested

有人可以解释为什么增量操作的行为如下吗?

>>> a = [ [0]*4 ] * 3

>>> print a

    [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

>>> a[1][1] += 1

>>> print a

    [[0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0]]

我被期待a = [[0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0]]

我知道numpy.array会给我预期的结果,但我真的想知道为什么嵌套列表不会...

3 个答案:

答案 0 :(得分:1)

观察:

In [9]:

a = [ [0]*4 ] * 3
In [10]:

map(id, a)
Out[10]:
[4382548912, 4382548912, 4382548912]

你认为你有3个列表,但实际上你有一个列表,3次。因此,当您更改一个列表的第一个元素的值时,将更改所有第一个元素。

答案 1 :(得分:0)

您有三个对同一子列表的引用,而不是三个单独的列表。

答案 2 :(得分:0)

这一切都是真的,然而,我认为它仍然令人惊讶和违反直觉。是的,有1份清单的3份副本;但是,这一个列表本身就是单个元素列表的4个副本,所以通过相同的“推理”或借口,为什么[1] [1] = 1不能设置内部列表的所有4个元素,因此所有12个原子元素,等于1;)

我认为深远与浅薄,但我认为这很难说,“哦,只要想一想,你就会意识到这是正确的行为。”这样实现的行为有它的位置,但我怀疑它是典型的用例,因此它是默认的,使它成为一个尖锐的角落(当然, imho )。