9

Possible Duplicate:
Python 2D list has weird behavor when trying to modify a single value

folks,

I am wondering if the two following statements are the same?

a = [[0]*3]*3
b = [[0]*3 for i in range(3)]

The results look the same. But would one way be better than the other? What is the difference here.

Thanks very much for your help.

nos

Community
  • 1
  • 1
nos
  • 19,875
  • 27
  • 98
  • 134

3 Answers3

18

They're not the same

>>> a[1][2] = 5
>>> a
>>> [[0, 0, 5], [0, 0, 5], [0, 0, 5]]


>>> b[1][2] = 5
>>> b
>>> [[0, 0, 0], [0, 0, 5], [0, 0, 0]]

The first one creates an outer array of pointers to a single inner array while the second actually creates 3 separate arrays.

Charles Ma
  • 47,141
  • 22
  • 87
  • 101
7

No they are not.
In the first one you have (a list of) 3 identical lists, same reference, in the second you have three different lists

>>> a = [[0]*3]*3
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[0][0]=1

>>> a
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]


>>> b = [[0]*3 for i in range(3)]
>>> b
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> b[0][0] = 1

>>> b
[[1, 0, 0], [0, 0, 0], [0, 0, 0]]
joaquin
  • 82,968
  • 29
  • 138
  • 152
0

It's a classic case of shallow-copy vs deep copy, as explained here in the Python docs :)

Ambidextrous
  • 810
  • 6
  • 14