On Nov 7, 5:26 am, MRAB <pyt...@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...@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 -- http://mail.python.org/mailman/listinfo/python-list