Verarbeitung von Daten als Referenz oder als Wert in Python

8

Betrachten Sie die folgende Sitzung. Wie werden die Unterschiede erklärt? Ich dachte, dass a += b ein syntaktischer Zucker von (und damit äquivalent) a = a + b ist. Offensichtlich liege ich falsch.

%Vor%

Danke

    
Boris Gorelik 10.08.2010, 09:07
quelle

2 Antworten

15

Der Operator + führt zu einem Aufruf der speziellen Methode __add__ das sollte ein neues Objekt erstellen und das Original nicht ändern.

Auf der anderen Seite führt die Verwendung des Operators += zu einem Aufruf von __iadd__ sollte das Objekt wenn möglich modifizieren, anstatt ein neues Objekt zu erstellen.

  

__add__

     

Diese Methoden werden aufgerufen, um die binären arithmetischen Operationen (+, -, *, //,%, divmod (), pow (), **, & lt; & lt; & gt; & gt; & amp ;; , |). Um beispielsweise den Ausdruck x + y auszuwerten, wobei x eine Instanz einer Klasse mit einer __add __ () -Methode ist, wird x .__ add __ (y) aufgerufen.

     

__iadd__

     

Diese Methoden werden aufgerufen, um die erweiterten arithmetischen Zuordnungen zu implementieren (+ =, - =, * =, / =, // =,% =, ** =, & lt; & lt; =, & gt; & gt; = & amp; ; =, ^ =, | =). Diese Methoden sollten versuchen, die Operation in-place (modifying self) durchzuführen und das Ergebnis zurückgeben (das kann sein, muss aber nicht selbst sein).

Natürlich ist es möglich, __add__ und __iadd__ zu implementieren, um ein anderes Verhalten zu haben, wenn Sie das möchten, aber was Sie beobachten, ist der Standard und empfohlene Weg. Und, ja, es ist ein wenig überraschend, wenn man es das erste Mal sieht.

    
Mark Byers 10.08.2010, 09:18
quelle
7
___ qstntxt ___

Betrachten Sie die folgende Sitzung. Wie werden die Unterschiede erklärt? Ich dachte, dass a += b ein syntaktischer Zucker von (und damit äquivalent) a = a + b ist. Offensichtlich liege ich falsch.

%Vor%

Danke

    
___ tag123syntax ___ Syntax bezieht sich auf die eigentlichen Sprachelemente und Symbole selbst. Fragen sollten als Syntax gekennzeichnet werden, wenn sich die Frage spezifisch und fast vollständig auf die Syntax bezieht. Dieses Tag sollte mit einem bestimmten Sprach-Tag verwendet werden ___ tag123numpy ___ NumPy ist eine wissenschaftliche und numerische Erweiterung der Programmiersprache Python. ___ tag123syntacticsugar ___ Syntactic Sugar ist ein Informatikbegriff, der sich auf Syntax innerhalb einer Programmiersprache bezieht, die das Lesen oder das Ausdrücken erleichtern soll. ___ qstnhdr ___ Verarbeitung von Daten als Referenz oder als Wert in Python ___ tag123python ___ Python ist eine dynamische und stark typisierte Programmiersprache, die die Usability betont. Zwei ähnliche, aber größtenteils inkompatible Versionen von Python sind weit verbreitet (2 und 3). Wenn Sie eine versionsspezifische Python-Frage haben, sollten Sie die Tags [python-2.7] oder [python-3.x] zusätzlich zum Tag [python] verwenden. Wenn Sie eine Python-Variante wie jython, pypy, iron-python usw. verwenden, kennzeichnen Sie diese bitte entsprechend. ___ answer3447509 ___

Der Operator + führt zu einem Aufruf der speziellen Methode __add__ das sollte ein neues Objekt erstellen und das Original nicht ändern.

Auf der anderen Seite führt die Verwendung des Operators += zu einem Aufruf von __iadd__ sollte das Objekt wenn möglich modifizieren, anstatt ein neues Objekt zu erstellen.

  

__iadd__

     

Diese Methoden werden aufgerufen, um die binären arithmetischen Operationen (+, -, *, //,%, divmod (), pow (), **, & lt; & lt; & gt; & gt; & amp ;; , |). Um beispielsweise den Ausdruck x + y auszuwerten, wobei x eine Instanz einer Klasse mit einer __add __ () -Methode ist, wird x .__ add __ (y) aufgerufen.

     

__add__

     

Diese Methoden werden aufgerufen, um die erweiterten arithmetischen Zuordnungen zu implementieren (+ =, - =, * =, / =, // =,% =, ** =, & lt; & lt; =, & gt; & gt; = & amp; ; =, ^ =, | =). Diese Methoden sollten versuchen, die Operation in-place (modifying self) durchzuführen und das Ergebnis zurückgeben (das kann sein, muss aber nicht selbst sein).

Natürlich ist es möglich, a += b und a = a + b zu implementieren, um ein anderes Verhalten zu haben, wenn Sie das möchten, aber was Sie beobachten, ist der Standard und empfohlene Weg. Und, ja, es ist ein wenig überraschend, wenn man es das erste Mal sieht.

    
___
Scott Griffiths 10.08.2010 10:50
quelle