The first one is a reference and second one is not. case 1: >>> m = [[0]*2]*4 >>> m[1][1]=7 >>> m [[0, 7], [0, 7], [0, 7], [0, 7]]
case 2: >>> m=[] >>> for r in range(4): ... m+=[[0]*2] ... >>> m [[0, 0], [0, 0], [0, 0], [0, 0]] >>> m[1][1]=7 >>> m [[0, 0], [0, 7], [0, 0], [0, 0]] We can make the second case look like first just by creating a reference to [[0]*2] which is what was done implicitly when multiplication operator was used. case 2 - modified for reference: >>> m=[] >>> mi = [[0]*2] >>> for r in range(4): ... m+=mi ... >>> m [[0, 0], [0, 0], [0, 0], [0, 0]] >>> mi[0][1]=7 >>> m [[0, 7], [0, 7], [0, 7], [0, 7]] >>> m[1][1]=1 >>> m [[0, 1], [0, 1], [0, 1], [0, 1]] >>> mi [[0, 1]] Aman Aggarwal-4 wrote: > > Hello there > > I am reading "How to think like a computer scientist" which is an > introductory test in Python. > > I wanna clarify the behaviour of multiply operator(*) when applied to > list(data structure). > > Consider the function make_matrix > > def make_matrix(rows, columns): > """ > >>> make_matrix(4, 2) > [[0, 0], [0, 0], [0, 0], [0, 0]] > >>> m = make_matrix(4, 2) > >>> m[1][1] = 7 > >>> m > [[0, 0], [0, 7], [0, 0], [0, 0]] > """ > return [[0] * columns] * rows > > > > > The actual output is > > [[0, 7], [0, 7], [0, 7], [0, 7]] > > > > > The correct version of make_matrix is : > > > > def make_matrix(rows, columns): > """ > >>> make_matrix(3, 5) > [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]] > >>> make_matrix(4, 2) > [[0, 0], [0, 0], [0, 0], [0, 0]] > >>> m = make_matrix(4, 2) > >>> m[1][1] = 7 > >>> m > [[0, 0], [0, 7], [0, 0], [0, 0]] > """ > matrix = [] > for row in range(rows): > matrix += [[0] * columns] > return matrix > > > The reason why first version of make_matrix fails ( as explained in > the book at 9.8 ) is that > > "...each row is an alias of the other rows..." > > I wonder why > > [[0] * columns] * rows > > causes "...each row is an alias of the other rows..." > > but not > > [[0] * columns] > > i.e. why each [0] in a row is not an alias of other row element. > > > > > > /* > Everything worth doing is worth doing in excess > */ > _______________________________________________ > BangPypers mailing list > BangPypers@python.org > http://mail.python.org/mailman/listinfo/bangpypers > > -- View this message in context: http://www.nabble.com/-New-bie-question---Clarification-on-%22Multiply%22-operator-applied-to-list%28data-structure%29-tp23960277p23961937.html Sent from the BangPypers - Bangalore Python Users Group mailing list archive at Nabble.com. _______________________________________________ BangPypers mailing list BangPypers@python.org http://mail.python.org/mailman/listinfo/bangpypers