On Tue, Dec 1, 2015 at 2:32 PM, Denis McMahon <[email protected]> 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: > > $ 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 >>>> tup[1] > [4, 5, 6, 7, 8, 9] >>>> tup > ([1, 2, 3], [4, 5, 6, 7, 8, 9]) >>>> quit()
No, that's the expected result. As MRAB wrote, the list *is* mutated when its __iadd__ method is called. The TypeError happens afterward when the assignment is attempted. -- https://mail.python.org/mailman/listinfo/python-list
