Warum ist operator.iadd(x, y)
nicht äquivalent zu z = x; z += y
? Und wie unterscheidet sich operator.iadd(x, y)
von operator.add(x, y)
?
Aus den Dokumenten :
Viele Operationen haben einen "In-Place" Ausführung. Die folgenden Funktionen bieten einen primitiveren Zugang zu In-Place-Betreiber als die üblichen Syntax tut; zum Beispiel, die Anweisung x + = y ist äquivalent zu x = operator.iadd (x, y). Ein anderer Weg sagen wir, dass z = operator.iadd (x, y) ist äquivalent zu die zusammengesetzte Aussage z = x; z + = y.
In Verbindung stehende Frage , aber ich interessiere mich nicht für Python-Klassenmethoden; nur reguläre Operatoren für integrierte Python-Typen.
Zuerst müssen Sie den Unterschied zwischen __add__
und __iadd__
verstehen.
Die Methode __add__
eines Objekts ist eine normale Addition: Sie benötigt zwei Parameter, gibt ihre Summe zurück und ändert keinen der Parameter.
Die Methode __iadd__
eines Objekts nimmt auch zwei Parameter, macht aber die Änderung an Ort und Stelle und ändert den Inhalt des ersten Parameters. Da dies eine Objektmutation erfordert, sollten unveränderliche Typen (wie die Standard-Zahlentypen) keine Methode __iadd__
haben.
a + b
verwendet __add__
. a += b
verwendet __iadd__
, wenn es existiert; Ist dies nicht der Fall, emuliert es es über __add__
, wie in tmp = a + b; a = tmp
. operator.add
und operator.iadd
unterscheiden sich auf die gleiche Weise.
Zur anderen Frage: operator.iadd(x, y)
ist nicht äquivalent zu z = x; z += y
, denn wenn kein __iadd__
existiert, wird stattdessen __add__
verwendet. Sie müssen den Wert zuweisen, um sicherzustellen, dass das Ergebnis in beiden Fällen gespeichert wird: x = operator.iadd(x, y)
.
Sie können das selbst leicht sehen:
%Vor%Tags und Links python function operator-keyword