Multi-dimensional list initialization
rusi
rustompmody at gmail.com
Tue Nov 6 23:11:45 EST 2012
On Nov 7, 5:26 am, MRAB <pyt... at mrabarnett.plus.com> wrote:
> I prefer the term "reference semantics".
Ha! That hits the nail on the head.
To go back to the OP:
On Nov 5, 11:28 am, Demian Brecht <demianbre... at gmail.com> wrote:
> 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[0] = 'a'
> >>> a
>
> ['a', None, None, None]
>
> >>> m = [[None] * 4] * 4
> >>> m[0][0] = '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.
>
m=[[None] * 2] * 3
is the same as
m=[[None]*2, [None]*2, [None]*2]
until one starts doing things like
m[0][0] = 'm'
So dont do it!
And to get python to help you by saying the same that I am saying do
m=((None) * 2) * 3
(well almost... its a bit more messy in practice)
m=(((None,) * 2),)*3
After that try assigning to m[0][0] and python will kindly say NO!
tl;dr version:
reference semantics is ok
assignment is ok (well up to a point)
assignment + reference semantics is not
More information about the Python-list
mailing list