Python Forum

Full Version: List repetition
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
my question here
I was experimenting with lists and this particular behavior of python caused me some confusion. Can anyone please clarify if what i think is right.
myList = [[1,2,3]] * 3
myList[0]=[1,2,3,4]
now when i print myList i get the following output: [[1,2,3,4],[1,2,3],[1,2,3]]
suppose i make a small change like this:
myList = [[1,2,3]] * 3
myList[0].append(4)
now when i print myList i get the following output: [[1,2,3,4],[1,2,3,4],[1,2,3,4]]

Since all 3 lists are one single list object with 3 references is this happening because in the first case I'm actually assigning a new object to the first position and in the second case I'm modifying the object that all 3 lists are referring to?
yes, your understanding is correct. Append modify the list in place, so you change the object that has 3 references to it. While in the former case you assign new different object to index 0.
Python does not duplicate an object in the memory.
In [1]: a = 2

In [2]: b = 2

In [3]: id(a)
Out[3]: 10914400

In [4]: id(b)
Out[4]: 10914400
https://www.youtube.com/watch?v=F6u5rhUQ6dU
Here just some test,so can you think of we they are different.
>>> lst_1 = [[1,2,3]] * 3
>>> lst_2 = [[1,2,3] for i in range(3)]
>>> lst_1
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
>>> lst_2
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
>>> 
>>> lst_1[0].append(4)
>>> lst_2[0].append(4)
>>> lst_1
[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
>>> lst_2
[[1, 2, 3, 4], [1, 2, 3], [1, 2, 3]]
>>> 
>>> [id(i) for i in lst_1]
[23028560, 23028560, 23028560]
>>> [id(i) for i in lst_2]
[65702968, 65711560, 65708120]
>>> 
>>> help(id)
Help on built-in function id in module builtins:

id(obj, /)
   Return the identity of an object.
   
   This is guaranteed to be unique among simultaneously existing objects.
   (CPython uses the object's memory address.)