Was genau macht + = in Python?


118

Ich muss wissen, was + = in Python macht. So einfach ist das. Ich würde mich auch über Links zu Definitionen anderer Kurzhandwerkzeuge in Python freuen.



2
Es ist ein grundlegender Operator für Python (und viele andere Sprachen auch). Sie sollten mit Google beginnen, wenn Sie keine Python-Referenzen lesen.
Technomage

3
@AndiDog Während beide Fragen den Operator (+ =) betreffen, handelt es sich bei der von Ihnen verknüpften Frage um eine ausgefeilte Verwendung und ein subtiles Problem, und das OP hier ist wahrscheinlich (noch) nicht in der Lage, den dortigen Überlegungen zu folgen.
Dr. Belisarius

3
@AndiDog Vielleicht hatten Sie zu dieser Zeit Recht, aber wenn Sie sich die (fast) akzeptierten Lösungen hier ansehen, ist klar, dass es sich bei dieser Frage um ein grundlegendes Verständnis des Bedieners handelt: D
Dr. belisarius

1
Die meisten Sumbol-Anwendungen sind jetzt auf der Symbolseite docs.python.org/3/genindex-Symbols.html indiziert .
Terry Jan Reedy

Antworten:


148

In Python ist + = eine Zuckerbeschichtung für die __iadd__spezielle Methode oder __add__oder __radd__falls __iadd__nicht vorhanden. Die __iadd__Methode einer Klasse kann alles tun, was sie will. Das Listenobjekt implementiert es und verwendet es, um über ein iterierbares Objekt zu iterieren, wobei jedes Element auf dieselbe Weise an sich angehängt wird wie die Erweiterungsmethode der Liste.

Hier ist eine einfache benutzerdefinierte Klasse, die die __iadd__spezielle Methode implementiert . Sie initialisieren das Objekt mit einem int und können dann mit dem Operator + = eine Zahl hinzufügen. Ich habe eine print-Anweisung hinzugefügt, um __iadd__zu zeigen, dass sie aufgerufen wird. Außerdem __iadd__wird erwartet, dass ein Objekt zurückgegeben wird, daher habe ich die Addition von sich selbst plus die andere Zahl zurückgegeben, was in diesem Fall sinnvoll ist.

>>> class Adder(object):
        def __init__(self, num=0):
            self.num = num

        def __iadd__(self, other):
            print 'in __iadd__', other
            self.num = self.num + other
            return self.num

>>> a = Adder(2)
>>> a += 3
in __iadd__ 3
>>> a
5

Hoffe das hilft.


24
Während dies nicht das ist, wonach der Asker gesucht hat, +1 für die echte Antwort. =)
Michael

@ Michael, hier trägt Humor zur Tatsache bei ... :-D
Aaron John Sabu

3
+1 für die Beantwortung der Frage, aber -1 für einen __iadd__, der einen anderen Typ zurückgibt (der selbst hinzugefügt werden kann)
Caleth

Diese Antwort ist zu komplex für den Typ von Person, der fragen müsste, was + = bedeutet (dh ein Anfänger). Ihre Antwort ist keine Anfängerantwort, nicht nur, weil Anfänger Python normalerweise nicht objektorientiert lernen, sondern auch, weil es viel einfachere Antworten gibt (wie bei @ Imran unten). Nur meine zwei Cent, obwohl ich diese Antwort schätze.
Q-Compute

129

+= Fügt dem Wert der Variablen einen weiteren Wert hinzu und weist der Variablen den neuen Wert zu.

>>> x = 3
>>> x += 2
>>> print x
5

-=, *=, /=Tut ähnlich für die Subtraktion, Multiplikation und Division.


19
"selbst" ist hier eigentlich eine sehr schlechte Beschreibung, da ganze Zahlen unveränderlich sind.
AndiDog

41

x += 5ist nicht genau das gleiche wie x = x + 5in Python zu sagen .

Beachten Sie hier:

In [1]: x = [2,3,4]    
In [2]: y = x    
In [3]: x += 7,8,9    
In [4]: x
Out[4]: [2, 3, 4, 7, 8, 9]    
In [5]: y
Out[5]: [2, 3, 4, 7, 8, 9]    
In [6]: x += [44,55]    
In [7]: x
Out[7]: [2, 3, 4, 7, 8, 9, 44, 55]    
In [8]: y
Out[8]: [2, 3, 4, 7, 8, 9, 44, 55]    
In [9]: x = x + [33,22]    
In [10]: x
Out[10]: [2, 3, 4, 7, 8, 9, 44, 55, 33, 22]    
In [11]: y
Out[11]: [2, 3, 4, 7, 8, 9, 44, 55]

Siehe als Referenz: Warum verhält sich + = auf Listen unerwartet?


es ist jedoch das gleiche, bis auf den seltsamen Fallx += 7,8,9
Ufos

Außerdem bietet einer der verknüpften Threads eine gute Diskussion darüber, wo genau er sich unterscheidet. stackoverflow.com/questions/6951792/…
Ufos

31

+=Fügt einer Variablen eine Zahl hinzu und ändert dabei die Variable selbst (wohingegen +dies nicht der Fall wäre). Ähnlich gibt es Folgendes, das auch die Variable ändert:

  • -=subtrahiert einen Wert von der Variablen und setzt die Variable auf das Ergebnis
  • *=, multipliziert die Variable und einen Wert und macht das Ergebnis zur Variablen
  • /=, dividiert die Variable durch den Wert und macht das Ergebnis zur Variablen
  • %=führt einen Modul für die Variable aus, wobei die Variable dann auf das Ergebnis gesetzt wird

Es kann andere geben. Ich bin kein Python-Programmierer.


2
Für Zahlen ist diese Antwort richtig. (Siehe Bryans Antwort für besonderes Verhalten.) Es gibt in der Tat einige andere, darunter Bitoperatoren ( &=, >>=usw.) und weitere mathematische Operatoren ( **=usw.).
Michael


15

Es ist keine bloße syntaktische Abkürzung. Versuche dies:

x=[]                   # empty list
x += "something"       # iterates over the string and appends to list
print(x)               # ['s', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']

gegen

x=[]                   # empty list
x = x + "something"    # TypeError: can only concatenate list (not "str") to list

Dies zeigt, dass + = die iadd-Listenmethode aufruft, + aber add aufruft , die mit Listen verschiedene Dinge tun.


7

Normalerweise fügt a + = b b zu einem Speichern des Ergebnisses in a hinzu. Diese vereinfachte Beschreibung würde den Operator + = in vielen Sprachen beschreiben.

Die vereinfachte Beschreibung wirft jedoch einige Fragen auf.

  1. Was genau meinen wir mit "Hinzufügen"?
  2. Was genau meinen wir mit "Speichern des Ergebnisses in a"? Python-Variablen speichern Werte nicht direkt, sondern Verweise auf Objekte.

In Python hängen die Antworten auf diese beiden Fragen vom Datentyp von a ab.


Was genau bedeutet "Hinzufügen"?

  • Für Zahlen bedeutet dies eine numerische Addition.
  • Für Listen, Tupel, Zeichenfolgen usw. bedeutet dies Verkettung.

Beachten Sie, dass für Listen + = flexibler als + ist und der Operator + in einer Liste eine andere Liste erfordert, der Operator + = jedoch alle iterierbaren Elemente akzeptiert.


Was bedeutet es also, den Wert in einem zu speichern?

Wenn das Objekt veränderbar ist, wird empfohlen (aber nicht erforderlich), die Änderung direkt durchzuführen. Ein Punkt zeigt also auf dasselbe Objekt wie zuvor, aber dieses Objekt hat jetzt einen anderen Inhalt.

Wenn das Objekt unveränderlich ist, kann es die Änderung offensichtlich nicht direkt durchführen. Einige veränderbare Objekte verfügen möglicherweise auch nicht über eine Implementierung einer direkten "Add" -Operation. In diesem Fall wird die Variable "a" aktualisiert, um auf ein neues Objekt zu verweisen, das das Ergebnis einer Additionsoperation enthält.

Technisch wird dies implementiert, indem zuerst gesucht wird __IADD__, wenn dies nicht implementiert ist, dann __ADD__wird versucht und schließlich __RADD__.


Bei der Verwendung von + = in Python für Variablen, bei denen wir uns nicht sicher sind, ob der Typ genau ist, und insbesondere wenn wir nicht sicher sind, ob der Typ veränderlich ist oder nicht, ist Vorsicht geboten. Betrachten Sie zum Beispiel den folgenden Code.

def dostuff(a):
    b = a
    a += (3,4)
    print(repr(a)+' '+repr(b))

dostuff((1,2))
dostuff([1,2])

Wenn wir Dostuff mit einem Tupel aufrufen, wird das Tupel als Teil der + = Operation kopiert und b bleibt davon unberührt. Wenn wir es jedoch mit einer Liste aufrufen, wird die Liste an Ort und Stelle geändert, sodass sowohl a als auch b betroffen sind.

In Python 3 wird ein ähnliches Verhalten bei den Typen "Bytes" und "Bytearray" beobachtet.


Beachten Sie schließlich, dass die Neuzuweisung auch dann erfolgt, wenn das Objekt nicht ersetzt wird. Dies spielt keine große Rolle, wenn die linke Seite nur eine Variable ist, kann jedoch zu verwirrendem Verhalten führen, wenn Sie eine unveränderliche Sammlung haben, die sich auf veränderbare Sammlungen bezieht, zum Beispiel:

a = ([1,2],[3,4])
a[0] += [5]

In diesem Fall wird [5] erfolgreich zu der Liste hinzugefügt, auf die mit [0] verwiesen wird. Anschließend wird eine Ausnahme ausgelöst, wenn der Code versucht, eine [0] neu zuzuweisen, und dies nicht schafft.


5

Die kurze Antwort +=kann übersetzt werden als "füge alles hinzu, was rechts vom + = zur Variablen links vom + = steht".

Ex. Wenn Sie a = 10dann haben a += 5würden: a = a + 5

Also, "a" jetzt gleich 15.


Was trägt diese Antwort bei, die noch nicht besprochen wurde? Es ist eine doppelte Antwort ...

jdv, ich versuche nur zu helfen. Ich bin ein neuer Mitwirkender. Es tut mir leid, wenn Sie glauben, dass meine Antwort ein Duplikat war.

Es ist klar, dass es sich um ein Duplikat handelt, wenn Sie sich die meisten anderen Antworten ansehen. Es ist in Ordnung, einen Beitrag zu leisten, aber Sie sollten sich bemühen, etwas Neues beizutragen (z. B. die Antwort add vs iadd), oder Sie möchten eine klarere Lösung finden. Aber soweit ich das beurteilen kann, sind die Antworten mit den höchsten Stimmen so klar wie möglich, um eine grundlegende Antwort zu erhalten.

4

Hinweis x += yist nicht dasselbe wie x = x + yin einigen Situationen, in denen ein zusätzlicher Operator enthalten ist, da der Operator Vorrang hat und die rechte Seite immer zuerst ausgewertet wird, z

>>> x = 2
>>> x += 2 and 1
>>> x
3

>>> x = 2
>>> x = x + 2 and 1
>>> x
1

Beachten Sie, dass der erste Fall erweitert wird auf:

>>> x = 2
>>> x = x + (2 and 1)
>>> x
3

Es ist wahrscheinlicher, dass Sie dies in der "realen Welt" mit anderen Betreibern begegnen, z

x *= 2 + 1== x = x * (2 + 1)! =x = x * 2 + 1


4

+= ist nur eine Abkürzung zum Schreiben

number = 4
number = number + 1

Also würdest du stattdessen schreiben

numbers = 4
numbers += 1

Beide Möglichkeiten sind korrekt, aber Beispiel zwei hilft Ihnen dabei, etwas weniger Code zu schreiben


1
Das Verhalten ist bei Zahlen gleich, aber im Allgemeinen nicht dasselbe.
Plugwash

0

Wie andere auch sagten, ist der Operator + = eine Verknüpfung. Ein Beispiel:

var = 1;
var = var + 1;
#var = 2

Es könnte auch so geschrieben werden:

var = 1;
var += 1;
#var = 2

Anstatt also das erste Beispiel zu schreiben, können Sie auch das zweite schreiben, was gut funktionieren würde.


0

Denken Sie daran, wenn Sie in Ihrem alten Taschenrechner beispielsweise 2 und =3 summiert haben und jedes Mal, wenn Sie die 3 treffen, die zur Gesamtsumme addiert werden, +=erledigt das einen ähnlichen Job. Beispiel:

>>> orange = 2
>>> orange += 3
>>> print(orange)
5
>>> orange +=3
>>> print(orange)
8

0

Ich sehe viele Antworten, die nicht mit + = mit mehreren ganzen Zahlen angezeigt werden.

Ein Beispiel:

x -= 1 + 3

Dies wäre ähnlich wie:

x = x - (1 + 3)

und nicht:

x = (x - 1) + 3

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.