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
  • 18,322
  • 27
  • 89
  • 126

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
  • 44,439
  • 22
  • 83
  • 99
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
  • 78,380
  • 27
  • 136
  • 151
0

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

Ambidextrous
  • 782
  • 5
  • 10