Multi-dimensional list initialization
demianbrecht at gmail.com
Mon Nov 5 07:27:52 CET 2012
So, here I was thinking "oh, this is a nice, easy way to initialize a 4D matrix" (running 2.7.3, non-core libs not allowed):
m = [[None] * 4] * 4
The way to get what I was after was:
m = [[None] * 4, [None] * 4, [None] * 4, [None * 4]]
(Obviously, I could have just hardcoded the initialization, but I'm too lazy to type all that out ;))
The behaviour I encountered seems a little contradictory to me. [None] * 4 creates four distinct elements in a single array while [[None] * 4] * 4 creates one distinct array of four distinct elements, with three references to it:
>>> a = [None] * 4
>>> a = 'a'
['a', None, None, None]
>>> m = [[None] * 4] * 4
>>> m = 'm'
[['m', None, None, None], ['m', None, None, None], ['m', None, None, None], ['m', None, None, None]]
Is this expected behaviour and if so, why? In my mind either result makes sense, but the inconsistency is what throws me off.
More information about the Python-list