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