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.
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.
Réponses:
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.
__iadd__
qui renvoie un type différent (qui lui-même peut être ajouté)
+=
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.
x += 5
n'est pas exactement la même chose que de dire x = x + 5
en 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?
x += 7,8,9
+=
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-ciIl peut y en avoir d'autres. Je ne suis pas un programmeur Python.
&=
, >>=
, etc.) et les opérateurs de mathématiques supplémentaires ( **=
, etc.).
Il ajoute l'opérande de droite à gauche. x += 2
veux direx = x + 2
Il peut également ajouter des éléments à une liste - voir ce fil SO .
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.
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.
En python, les réponses à ces deux questions dépendent du type de données de a.
Alors, que signifie exactement «ajouter»?
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].
La réponse courte +=
peut être traduite par "ajouter ce qui se trouve à droite du + = à la variable à gauche du + =".
Ex. Si vous avez a = 10
alors ce a += 5
serait: a = a + 5
Donc, "a" est maintenant égal à 15.
La remarque x += y
n'est pas la même que x = x + y
dans 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
+=
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
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.
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
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
Selon la documentation
x += y
équivaut àx = operator.iadd(x, y)
. Une autre façon de le dire est de dire que celaz = operator.iadd(x, y)
équivaut à l'instruction composéez = x; z += y
.
C'est donc x += 3
le même que x = x + 3
.
x = 2
x += 3
print(x)
produira 5.
Notez qu'il y a aussi
object.__iadd__