List of lists surprising behaviour

bart.c bartc at freeuk.com
Thu Jun 17 19:20:30 EDT 2010


"J Kenneth King" <james at agentultra.com> wrote in message
news:87wrtxh0dq.fsf at agentultra.com...
> candide <candide at free.invalid> writes:
>
>> Let's the following code :
>>
>>>>> t=[[0]*2]*3
>>>>> t
>> [[0, 0], [0, 0], [0, 0]]
>>>>> t[0][0]=1
>>>>> t
>> [[1, 0], [1, 0], [1, 0]]
>>
>> Rather surprising, isn't it ?
>
> Not at all, actually.

The code is clearly trying to set only t[0][0] to 1, not t[1][0] and t[2][0]
as well.

This behaviour is quite scary actually, especially when t[0]=42 *does* work
as expected, while t[0][0]=42 is apparently duplicated. It appears
inconsistent.

> I'd be surprised if the multiplication operator was aware of object
> constructors.  Even arrays are "objects" in Python.  Should the
> multiplication operator know how to instantiate three arrays from a
> single array instance?  What about an instance of a user-defined class?

Multiplication operators shouldn't need to be directly aware of any such 
thing; it should just request that an object be duplicated without worrying 
about how it's done.

I don't know how Python does things, but an object should either specify a 
special way of duplicating itself, or lend itself to some standard way of 
doing so. (So for a list, it's just a question of copying the data in the 
list, then recursively duplicating each new element..)

-- 
Bartc




More information about the Python-list mailing list