J'ai besoin de savoir ce que +=
fait en Python. C'est aussi simple que cela. J'apprécierais également des liens vers des définitions d'autres outils de sténographie en Python.
Réponses
Trop de publicités?Il ajoute l'opérande de droite à celui de gauche. x += 2
signifie x = x + 2
Il peut également ajouter des éléments à une liste -- voir ce fil de SO .
Notionnellement, a += b "ajoute" b à a en stockant le résultat dans a. Cette description simpliste décrirait l'opérateur += dans de nombreux langages.
Toutefois, cette description simpliste soulève quelques questions.
- Qu'entendons-nous exactement par "ajouter" ?
- Qu'entend-on exactement par "stocker le résultat dans un" ? Les variables python ne stockent pas directement des valeurs, mais des références à des objets.
En python, les réponses à ces deux questions dépendent du type de données de a.
Que signifie exactement "ajouter" ?
- Pour les nombres, cela signifie l'addition numérique.
- Pour les listes, les tuples, les chaînes de caractères, etc., cela signifie la 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 n'importe quel itérable.
Que signifie donc "stocker la valeur dans un" ?
Si l'objet est mutable, il est encouragé (mais pas obligatoire) d'effectuer la modification sur place. Ainsi, a pointe vers le même objet qu'auparavant, 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 mutables peuvent également ne pas avoir d'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 __IADD__
d'abord, si cela n'est pas mis en œuvre, alors __ADD__
est essayé et finalement __RADD__
.
Il faut être prudent lorsqu'on utilise += en python sur des variables dont on n'est pas certain du type exact et en particulier lorsqu'on n'est pas certain que 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 invoquons 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'invoquons avec une liste, la liste est modifiée sur place, et donc a et b sont affectés.
Dans python 3, un comportement similaire est observé avec les types "bytes" et "bytearray".
Enfin, notez 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 causer un comportement confus 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 à laquelle fait référence a[0], mais ensuite, une exception sera levée lorsque le code essaiera de réaffecter a[0] sans y parvenir.
Note x += y
n'est pas la même chose que x = x + y
dans certaines situations où un opérateur supplémentaire est inclus en raison de la la préséance des opérateurs combiné au fait que le côté droit est toujours évalué en premier, par ex.
>>> x = 2
>>> x += 2 and 1
>>> x
3
>>> x = 2
>>> x = x + 2 and 1
>>> x
1
Notez que le premier cas s'étend à :
>>> x = 2
>>> x = x + (2 and 1)
>>> x
3
Il est plus probable que vous rencontriez ce problème dans le "monde réel" avec d'autres opérateurs, par ex.
x *= 2 + 1
== x = x * (2 + 1)
!= x = x * 2 + 1
7 votes
object.__iadd__
2 votes
C'est un opérateur de base pour python (et beaucoup d'autres langages aussi), vous devriez commencer avec google, si vous n'avez jamais lu de références sur python.
3 votes
@AndiDog Bien qu'il soit vrai que les deux questions portent sur l'opérateur (+=), celle que vous avez liée concerne un usage sophistiqué et un problème subtil, et le PO ici n'est probablement pas en mesure de suivre le raisonnement (encore).
0 votes
@belisarius : Je prenais la question littéralement - elle contient le mot "exactement" . C'est pourquoi j'ai suggéré l'autre question. Je pense que c'est tout à fait clair ce que
+=
mais pas comment il fonctionne sous le capot.3 votes
@AndiDog Peut-être aviez-vous 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
1 votes
La plupart des utilisations de sumbol sont maintenant indexées dans la page des symboles. docs.python.org/3/genindex-Symboles.html .