Dzieje się tak, ponieważ operator +=
(który jest __iadd__
, lub w miejscu dodać wewnętrznie) faktycznie zwraca coś po tym, jak zadanie zostało wykonane. W przypadku list
oznacza to wywołanie extend
(lub coś podobnego), a zatem nowe elementy już zostały wprowadzone, zanim odwołanie do listy zostało zwrócone do przypisania do t[2]
, które następnie podnoszą wyjątek. Teraz sprawdzasz wartość, jaką widzisz, że została dodana. Poniżej znajduje się minimalny kod wykazać to:
>>> class AddIDemo(object):
... def __init__(self, items):
... self.items = list(items)
... def __iadd__(self, other):
... print('extending other %r' % other)
... self.items.extend(other.items)
... print('returning self to complete +=')
... return self
... def __repr__(self):
... return self.items.__repr__()
...
>>> demo = AddIDemo([1, 2])
>>> demo += AddIDemo([3, 4])
extending other [3, 4]
returning self to complete +=
>>> demo
[1, 2, 3, 4]
>>> t = 1, 2, demo
>>> t
(1, 2, [1, 2, 3, 4])
>>>
>>> t[2] += AddIDemo([5, 6])
extending other [5, 6]
returning self to complete +=
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> t
(1, 2, [1, 2, 3, 4, 5, 6])
>>>
Zauważ, że dodałem jeszcze kilka sprawozdań z tuszem, aby pokazać, że funkcja jest nazywany i jak operacja się, jak to zrobić w standardowym list
manipulacji poprzez +=
lub __iadd__
.
Zauważ, że 't [2] = t [2] + [1,2]' podnosi, ale nie modyfikuje krotki –