Que fait exactement + = en python?

118

J'ai besoin de savoir ce que + = fait en python. C'est si simple. J'apprécierais également des liens vers des définitions d'autres outils à main courte en python.

Salvatore Mucciolo
la source
5
object.__iadd__
éphémère le
2
c'est un opérateur de base pour python (et de nombreux autres langages aussi), vous devriez commencer par google, si vous ne lisez jamais de références python.
technomage
3
@AndiDog Bien qu'il soit vrai que les deux questions concernent l'opérateur (+ =), celle que vous avez liée concerne un usage sophistiqué et un problème subtil, et l'OP ici n'est probablement pas en mesure de suivre (encore) le raisonnement.
Dr. belisarius
3
@AndiDog Vous aviez peut-être raison à ce moment-là, mais en regardant les solutions (presque) acceptées ici, il est clair que cette question concerne une compréhension de base de l'opérateur: D
Dr. belisarius
1
La plupart des utilisations de sumbol sont maintenant indexés dans la page Symboles docs.python.org/3/genindex-Symbols.html .
Terry Jan Reedy

Réponses:

148

En Python, + = est l'enrobage de sucre pour la __iadd__méthode spéciale, ou __add__ou __radd__si __iadd__n'est pas présent. La __iadd__méthode d'une classe peut faire tout ce qu'elle veut. L'objet list l'implémente et l'utilise pour itérer sur un objet itérable en ajoutant chaque élément à lui-même de la même manière que la méthode extend de la liste.

Voici une simple classe personnalisée qui implémente la __iadd__méthode spéciale. Vous initialisez l'objet avec un int, puis pouvez utiliser l'opérateur + = pour ajouter un nombre. J'ai ajouté une instruction d'impression __iadd__pour montrer qu'elle est appelée. De plus, __iadd__on s'attend à ce qu'il retourne un objet, j'ai donc renvoyé l'addition de lui-même plus l'autre nombre qui a du sens dans ce cas.

>>> 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

J'espère que cela t'aides.

Bryan
la source
24
Bien que ce ne soit pas ce que recherchait le demandeur, +1 pour la vraie réponse. =)
Michael
@Michael, c'est là que l'humour ajoute au fait ... :-D
Aaron John Sabu
3
+1 pour répondre à la question, mais -1 pour un __iadd__qui renvoie un type différent (qui lui-même peut être ajouté)
Caleth
Cette réponse est trop complexe pour le type de personne qui aurait besoin de demander ce que signifie + = (c'est-à-dire un débutant). Votre réponse n'est pas une réponse de débutant, non seulement parce que les débutants ne commencent généralement pas à apprendre Python de manière orientée objet, mais aussi parce qu'il existe des réponses beaucoup plus simples (comme @ Imran ci-dessous). Juste mes deux cents, même si j'apprécie cette réponse.
q-compute
129

+= ajoute une autre valeur avec la valeur de la variable et affecte la nouvelle valeur à la variable.

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

-=, *=, /=Fait similaire pour la soustraction, la multiplication et la division.

Imran
la source
19
«lui-même» est en fait une très mauvaise description ici, car les entiers sont immuables.
AndiDog
41

x += 5n'est pas exactement la même chose que de dire x = x + 5en Python.

Notez ici:

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]

Voir pour référence: Pourquoi + = se comporte-t-il de manière inattendue sur les listes?

Roshan Mehta
la source
c'est la même chose, sauf pour le cas étrangex += 7,8,9
Ufos
En outre, l'un des fils liés fournit une bonne discussion sur les différences exactes. stackoverflow.com/questions/6951792/…
Ufos
31

+=ajoute un nombre à une variable, en modifiant la variable elle-même dans le processus (alors que +ce ne serait pas le cas). Similaire à cela, il y a les éléments suivants qui modifient également la variable:

  • -=, soustrait une valeur de variable, définissant la variable sur le résultat
  • *=, multiplie la variable et une valeur, faisant du résultat la variable
  • /=, divise la variable par la valeur, faisant du résultat la variable
  • %=, effectue un module sur la variable, la variable étant alors définie sur le résultat de celle-ci

Il peut y en avoir d'autres. Je ne suis pas un programmeur Python.

Ryan Bigg
la source
2
Pour les nombres, cette réponse est correcte. (Voir la réponse de Bryan pour un comportement spécial.) Il y a en effet plusieurs autres, y compris les opérateurs binaires ( &=, >>=, etc.) et les opérateurs de mathématiques supplémentaires ( **=, etc.).
Michael
16

Il ajoute l'opérande de droite à gauche. x += 2veux direx = x + 2

Il peut également ajouter des éléments à une liste - voir ce fil SO .

Kaleb Brasee
la source
15

Ce n'est pas un simple raccourci syntaxique. Essaye ça:

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

contre

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

Ceci illustre que + = invoque la méthode de liste iadd mais + appelle add , qui fait différentes choses avec les listes.

CS
la source
7

Notamment a + = b "ajoute" b à a en stockant le résultat dans a. Cette description simpliste décrirait l'opérateur + = dans de nombreuses langues.

Cependant, la description simpliste soulève quelques questions.

  1. Qu'entend-on exactement par «ajouter»?
  2. Qu'entend-on exactement par «stocker le résultat dans un»? Les variables python ne stockent pas directement les valeurs, elles stockent les références aux objets.

En python, les réponses à ces deux questions dépendent du type de données de a.


Alors, que signifie exactement «ajouter»?

  • Pour les nombres, cela signifie une addition numérique.
  • Pour les listes, les tuples, les chaînes, etc., cela signifie concaténation.

Notez que pour les listes + = est plus flexible que +, l'opérateur + sur une liste nécessite une autre liste, mais l'opérateur + = acceptera tout itérable.


Alors, que signifie «stocker la valeur dans un»?

Si l'objet est mutable, il est encouragé (mais pas obligatoire) à effectuer la modification sur place. Ainsi, a pointe vers le même objet qu'avant, mais cet objet a maintenant un contenu différent.

Si l'objet est immuable, il ne peut évidemment pas effectuer la modification sur place. Certains objets modifiables peuvent également ne pas avoir une implémentation d'une opération "d'ajout" sur place. Dans ce cas, la variable "a" sera mise à jour pour pointer vers un nouvel objet contenant le résultat d'une opération d'addition.

Techniquement, cela est mis en œuvre en recherchant d' __IADD__abord, si cela n'est pas implémenté, alors __ADD__est essayé et enfin __RADD__.


Des précautions sont nécessaires lors de l'utilisation de + = en python sur des variables dont nous ne sommes pas certains du type exact et en particulier lorsque nous ne sommes pas certains si le type est mutable ou non. Par exemple, considérez le code suivant.

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

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

Lorsque nous appelons dostuff avec un tuple, le tuple est copié dans le cadre de l'opération + = et donc b n'est pas affecté. Cependant, lorsque nous l'appelons avec une liste, la liste est modifiée sur place, donc a et b sont affectés.

En python 3, un comportement similaire est observé avec les types "bytes" et "bytearray".


Notez enfin que la réaffectation se produit même si l'objet n'est pas remplacé. Cela n'a pas beaucoup d'importance si le côté gauche est simplement une variable, mais cela peut provoquer un comportement déroutant lorsque vous avez une collection immuable faisant référence à des collections mutables par exemple:

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

Dans ce cas, [5] sera ajouté avec succès à la liste référencée par un [0] mais ensuite une exception sera déclenchée lorsque le code essaiera et échouera de réaffecter un [0].

plugwash
la source
5

La réponse courte +=peut être traduite par "ajouter ce qui se trouve à droite du + = à la variable à gauche du + =".

Ex. Si vous avez a = 10alors ce a += 5serait: a = a + 5

Donc, "a" est maintenant égal à 15.

Roman Skydan
la source
Qu'est-ce que cette réponse apporte qui n'a pas déjà été discutée? C'est une réponse en double ...
jdv, essayant juste d'aider. Je suis un nouveau contributeur, désolé si vous pensez que ma réponse était un double.
Il est clair que c'est un doublon si vous regardez la plupart des autres réponses. C'est bien de contribuer, mais vous devriez vous efforcer de contribuer quelque chose de nouveau (par exemple, comme la réponse add vs iadd) ou vous voulez essayer une solution plus claire. Mais, pour autant que je sache, les réponses les plus votées sont à peu près aussi claires que possible pour une réponse de base.
4

La remarque x += yn'est pas la même que x = x + ydans certaines situations où un opérateur supplémentaire est inclus en raison de la priorité des opérateurs combinée au fait que le côté droit est toujours évalué en premier, par exemple

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

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

Notez que le premier cas se développe en:

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

Vous êtes plus susceptible de rencontrer cela dans le «monde réel» avec d'autres opérateurs, par exemple

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

Chris_Rands
la source
4

+= est juste un raccourci pour écrire

number = 4
number = number + 1

Alors à la place tu écrirais

numbers = 4
numbers += 1

Les deux méthodes sont correctes mais l'exemple deux vous aide à écrire un peu moins de code

Vash
la source
1
Le comportement est le même sur les nombres mais ce n'est pas le même en général.
plugwash
0

Comme d'autres l'ont également dit, l'opérateur + = est un raccourci. Un exemple:

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

Cela pourrait aussi être écrit comme ceci:

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

Donc, au lieu d'écrire le premier exemple, vous pouvez simplement écrire le second, qui fonctionnerait très bien.

ZeroFunter
la source
0

Rappelez-vous quand vous aviez l'habitude de faire la somme, par exemple 2 et 3, dans votre ancienne calculatrice et à chaque fois que vous frappez le, =vous voyez 3 ajouté au total, le +=travail est similaire. Exemple:

>>> orange = 2
>>> orange += 3
>>> print(orange)
5
>>> orange +=3
>>> print(orange)
8
salhin
la source
0

Je vois beaucoup de réponses qui n'évoquent pas l'utilisation de + = avec plusieurs entiers.

Un exemple:

x -= 1 + 3

Ce serait similaire à:

x = x - (1 + 3)

et pas:

x = (x - 1) + 3
Javier Perez
la source
0

Selon la documentation

x += yéquivaut à x = operator.iadd(x, y). Une autre façon de le dire est de dire que cela z = operator.iadd(x, y)équivaut à l'instruction composée z = x; z += y.

C'est donc x += 3le même que x = x + 3.

x = 2

x += 3

print(x)

produira 5.

Notez qu'il y a aussi

Tiago Martins Peres 李大仁
la source