Dies ist, weil der +=
-Operator (der __iadd__
ist, oder direkt intern hinzugefügt) tatsächlich etwas zurückgeben, nachdem die Zuordnung passiert ist. In einem list
dies übersetzt in einen extend
Aufruf (oder so ähnlich) und damit die neuen Elemente bereits eingegangen, bevor der Verweis auf die Liste zur Zuordnung an t[2]
zurückgegeben wurde, die dann die Ausnahme auslösen. Jetzt überprüfen Sie den Wert, den Sie sehen können, dass es hinzugefügt wurde. Im Folgenden ist der minimale Code zu demonstrieren dies:
>>> 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])
>>>
Bitte beachten, dass ich noch ein paar print-Anweisungen hinzugefügt, um anzuzeigen, dass die Funktion aufgerufen wird und wie die Operation passiert ist, wie es in einer Standard-list
Manipulation über +=
tun würde oder __iadd__
.
Beachten Sie, dass 't [2] = t [2] + [1,2]' erhöht, aber das Tupel nicht ändert –