[BangPypers] [New bie question ] Clarification on "Multiply" operator applied to list(data structure)

Shivaraj M S shivraj.ms at gmail.com
Wed Jun 10 15:09:16 CEST 2009


The first one is a case of reference/alias 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 at 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-tp23960277p23961977.html
Sent from the BangPypers - Bangalore Python Users Group mailing list archive at Nabble.com.



More information about the BangPypers mailing list