140 votes

Que fait exactement += en python ?

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.

7 votes

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

17voto

Kaleb Brasee Points 25776

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 .

9voto

plugwash Points 795

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.

  1. Qu'entendons-nous exactement par "ajouter" ?
  2. 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.

6voto

Chris_Rands Points 15161

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

5voto

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

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

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

4voto

Vash Points 145

+= est juste un raccourci pour écrire

number = 4
number = number + 1

Vous écrirez donc à la place

numbers = 4
numbers += 1

Les deux façons sont correctes mais l'exemple deux vous aide à écrire un peu moins de code

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X