Python List Mutable
Solution 1:
arr = [] is an empty list, and when you append tmp to it via:
tmp = [1, 2]
arr.append(tmp)
You are putting tmp in the arr list, thus giving you arr = [tmp] which can be expanded to arr = [[1,2]]. But the neat thing here is that you maintain a reference to to the list, [1,2] via the temp variable. Thus, when you append temp you are appending the same list that is in arr.
For a bit further clarification, just because you are appending tmp to arr doesn't mean that the resulting list [[1,2]] is all going to be one continuous block in memory. You are going to have the arr list and the first element of arr is going to be a pointer to the list tmp.
Solution 2:
All the comments are great ones.
arr.append(tmp)
print arr # [[1,2]]
As you can see, the result is NOT:
print arr # [1,2]
So, arr just holds the reference to tmp array. If my guess is write you are looking for:
arr.extend(tmp)
print arr # [1,2]
More on difference between append vs. extend list methods in python
Solution 3:
That's because of both tmp and arr[0] points to the same object.
Just check it here, step by step:
http://www.pythontutor.com/visualize.html
First print statement Second print statement
You can manually check it by using id built-in
>>> arr = []
>>> tmp = [1,2]
>>> arr.append(tmp)
>>> id(tmp)
4404123192
>>> id(arr[0])
4404123192
>>> assert id(tmp) == id(arr[0])
>>> tmp.append(3) # allocate more memory (if needs) and add '3' to object (list) with id 4404123192
>>> id(tmp)
4404123192
>>> id(arr[0])
4404123192
>>> print arr
[[1, 2, 3]]
Post a Comment for "Python List Mutable"