+ 1
Can someone please explain why the output of this code is what it is?!
nums = [1, 2] nums.append(nums) print(nums) print(nums[2]) print(nums[2][2]) print(nums[2][2][2]) print(nums==nums[2])
2 Answers
+ 3
After the call "nums.append(nums)", nums will become a list with the third item being a reference to a list (in this case a reference to itself).
Therefore, nums will look like [1,2,<ref_to_nums>].
When you go to nums[2], you will just get a reference to the nums list.
And, every print you listed (except the last comparison), will just print the nums list itsef, because index 2 of the nums list is the nums list.
The last print will be True, because, again, nums[2] is just a reference to nums.
...
Just remember the third item is just a reference to the list.
Hope that's somewhat clear.
+ 2
Complementary:
To avoid copying an array by reference and perform "deep" copy, use the slice notation of Python...
In the case of the example, the behavior change if you write:
nums.append( nums[ : ] )
... as now, new element inserted in nums is a real copy by value, not just by reference ;)