Wie unterscheiden sich die Operatorfunktionen von Python von den Standardoperatorfunktionen?

7

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.

    
Leftium 23.01.2011, 08:44
quelle

2 Antworten

21

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%     
Glenn Maynard 23.01.2011, 09:21
quelle
0

Vielleicht, weil einige Python-Objekte unveränderlich sind.

Ich denke, operator.iadd(x, y) entspricht z = x; z += y nur für veränderbare Typen wie Wörterbücher und Listen, aber nicht für unveränderliche Typen wie Zahlen und Zeichenfolgen.

    
Leftium 23.01.2011 08:47
quelle