Are these two expressions the same?
a = [[0]*3]*3
b = [[0]*3 for i in range(3)]
The resulting a and b values look the same. But would one way be better than the other? What is the difference here.
Are these two expressions the same?
a = [[0]*3]*3
b = [[0]*3 for i in range(3)]
The resulting a and b values look the same. But would one way be better than the other? What is the difference here.
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.
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]]
a[0].append("foo").It's a classic case of shallow-copy vs deep copy, as explained here in the Python docs :)