1

Can anyone explain why is this happening?

Case 1:

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

Case 2:

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

Why is this going on? I am expecting that the behavior of the array in case 1 to be as in case 2 but it is not for some reason.

caylus
  • 470
  • 4
  • 11
  • Shallow copy in first case? – Arpan Jun 24 '16 at 16:23
  • 4
    Note that these are Python `list`s, not arrays. In the context of Python, `array` is usually interpreted to mean a NumPy array (though there's also a standard library `array` module). – Mark Dickinson Jun 24 '16 at 16:26

2 Answers2

3

In the first case, the three elements in a actually reference to the same list objects. You can check their id:

>>> id(a[0])
4524132472
>>> id(a[1])
4524132472
>>> id(a[2])
4524132472
Yu Hao
  • 119,891
  • 44
  • 235
  • 294
2

In the first case, you are creating a list [0] and duplicate it 3 times. This is the same object repeated three times. You should use the star form only with immutable type

To avoid this issue when you have a mutable type, use list comprehension:

a = [[0] for _ in range(3)]
Jacques Gaudin
  • 15,779
  • 10
  • 54
  • 75