List of lists surprising behaviour
Benjamin Kaplan
benjamin.kaplan at case.edu
Thu Jun 17 19:44:49 EDT 2010
On Thu, Jun 17, 2010 at 4:20 PM, bart.c <bartc at freeuk.com> wrote:
>
> "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
It's the recursively duplicating each element that's the problem. How
do you know when to stop?
More information about the Python-list
mailing list