2D lists

Marcin Matuszkiewicz marcin at finisar.com
Sun Jan 19 23:38:32 EST 2003


What is a most efficient way to create an intialized 2D list?

Marcin

Manuel M. Garcia wrote:

> On 20 Jan 2003 11:06:47 -0800, marcin at finisar.com (Marcin
> Matuszkiewicz) wrote:
> 
>>In the code below I created a two dimensional list in two ways.  List
>>b behaves I expect, list a does not.  Could someone explain it?
>>
>>>>> a=[[0]*4]*2
>>>>> a
>>[[0, 0, 0, 0], [0, 0, 0, 0]]
>>>>> a[0][0]=1
>>>>> a
>>[[1, 0, 0, 0], [1, 0, 0, 0]]
>>>>> b=[[0, 0, 0, 0], [0, 0, 0, 0]]
>>>>> b[0][0]=1
>>>>> b
>>[[1, 0, 0, 0], [0, 0, 0, 0]]
>>>>>
>>
>>Thanks,
>>
>>Marcin
> 
> safe way to create a 2 dimensional list initialized with zeros
> 
>>>> a = [ [0] * 2 for _ in range(3) ]
>>>> a
> [[0, 0], [0, 0], [0, 0]]
>>>> x = 0
>>>> for i in range(3):
> ...   for j in range(2):
> ...           a[i][j] = x
> ...           x += 1
> ...
>>>> a
> [[0, 1], [2, 3], [4, 5]]
> 
> [0] * 2 is a safe way to create a 2 dimensional list, because of the
> immutability of 0.
> 
> [0] * 2 is not immutable, so [[0] * 2] * 3 is NOT a safe way to create
> a 2 dimensional list.
> 
> [ x for y in z ] is called a "list comprehension".  It is a recent
> addition to Python, and quite handy, but a little strange looking.
> 
> The underscore "_" is a standard idiom for a thrown-away value.  This
> works just as well:
> 
> a = [ [0] * 2 for junk in range(3) ]
> 
> Manuel





More information about the Python-list mailing list