Could you explain this rebinding (or some other action) on "nums = nums"?

Terry Reedy tjreedy at udel.edu
Tue Dec 1 16:18:49 EST 2015


On 12/1/2015 3:32 PM, Denis McMahon wrote:
> On Tue, 01 Dec 2015 03:32:31 +0000, MRAB wrote:
>
>> In the case of:
>>
>>       tup[1] += [6, 7]
>>
>> what it's trying to do is:
>>
>>       tup[1] = tup[1].__iadd__([6, 7])
>>
>> tup[1] refers to a list, and the __iadd__ method _does_ mutate it, but
>> then Python tries to put the result that the method returns into tup[1].
>> That fails because tup itself is a tuple, which is immutable.
>
> I think I might have found a bug:

What you found is an specific example of what MRAB said in general above.

> $ python
> Python 2.7.3 (default, Jun 22 2015, 19:33:41)
> [GCC 4.6.3] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
>>>> tup = [1,2,3],[4,5,6]
>>>> tup
> ([1, 2, 3], [4, 5, 6])
>>>> tup[1]
> [4, 5, 6]
>>>> tup[1] += [7,8,9]
> Traceback (most recent call last):
>    File "<stdin>", line 1, in <module>
> TypeError: 'tuple' object does not support item assignment

The bug is trying to replace a member of a tuple.  The correct code, to 
avoid the exception while extending the list, is

tup[1].extend([7,8,9])

>>>> tup[1]
> [4, 5, 6, 7, 8, 9]

-- 
Terry Jan Reedy




More information about the Python-list mailing list