Why does this code for initializing a list of lists apparently link the lists together?
--------------------------------------------------
Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Mysterious Puzzle
--
Chapters
00:00 Why Does This Code For Initializing A List Of Lists Apparently Link The Lists Together?
00:25 Accepted Answer Score 395
01:12 Thank you
--
Full question
https://stackoverflow.com/questions/1279...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #list
#avk47
    Rise to the top 3% as a developer or hire one of them at Toptal: https://topt.al/25cXVn
--------------------------------------------------
Music by Eric Matyas
https://www.soundimage.org
Track title: Mysterious Puzzle
--
Chapters
00:00 Why Does This Code For Initializing A List Of Lists Apparently Link The Lists Together?
00:25 Accepted Answer Score 395
01:12 Thank you
--
Full question
https://stackoverflow.com/questions/1279...
--
Content licensed under CC BY-SA
https://meta.stackexchange.com/help/lice...
--
Tags
#python #list
#avk47
ACCEPTED ANSWER
Score 395
The problem is that they're all the same exact list in memory. When you use the [x]*n syntax, what you get is a list of n many x objects, but they're all references to the same object. They're not distinct instances, rather, just n references to the same instance.
To make a list of 3 different lists, do this:
x = [[] for i in range(3)]
This gives you 3 separate instances of [], which is what you want
[[]]*n is similar to
l = []
x = []
for i in range(n):
    x.append(l)
While [[] for i in range(3)] is similar to:
x = []
for i in range(n):
    x.append([])   # appending a new list!
In [20]: x = [[]] * 4
In [21]: [id(i) for i in x]
Out[21]: [164363948, 164363948, 164363948, 164363948] # same id()'s for each list,i.e same object
In [22]: x=[[] for i in range(4)]
In [23]: [id(i) for i in x]
Out[23]: [164382060, 164364140, 164363628, 164381292] #different id(), i.e unique objects this time