有人可以解释为什么增量操作的行为如下吗?
>>> 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
会给我预期的结果,但我真的想知道为什么嵌套列表不会...
答案 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 )。