Je vois un code comme celui-ci par exemple en Python:
if cnt > 0 and len(aStr) > 1:
while cnt > 0:
aStr = aStr[1:]+aStr[0]
cnt += 1
Que signifie le +=
?
a += b
est essentiellement identique à a = a + b
, sauf que:
+
renvoie toujours un objet nouvellement alloué, mais +=
doit (mais ne doit pas obligatoirement) modifier l'objet en place s'il est mutable (par exemple, list
ou dict
, mais int
et str
sont immuables).a = a + b
, a
est évalué deux fois.http://docs.python.org/reference/simple_stmts.html#augmented-assignment-statements
Si vous rencontrez l'opérateur +=
pour la première fois, vous vous demandez peut-être pourquoi il est important de pouvoir modifier l'objet en place au lieu d'en créer un nouveau. Voici un exemple:
# two variables referring to the same list
>>> list1 = []
>>> list2 = list1
# += modifies the object pointed to by list1 and list2
>>> list1 += [0]
>>> list1, list2
([0], [0])
# + creates a new, independent object
>>> list1 = []
>>> list2 = list1
>>> list1 = list1 + [0]
>>> list1, list2
([0], [])
a += b
est dans ce cas le même que
a = a + b
Dans ce cas, cnt + = 1 signifie que cnt est augmenté de un.
Notez que le code que vous avez collé sera mis en boucle indéfiniment si cnt> 0 et len (aStr)> 1.
Edit: quote Carl Meyer : `` [..] la réponse est généralement trompeuse. Il existe une différence subtile mais très significative entre + et + =, voir Réponse de Bastien . ''.
L'opérateur "python + =" de Google vous mène à http://docs.python.org/library/operator.html
Recherchez + = une fois la page chargée pour une réponse plus détaillée.
Pour votre information: il semblerait que vous ayez une boucle infinie dans votre exemple ...
if cnt > 0 and len(aStr) > 1:
while cnt > 0:
aStr = aStr[1:]+aStr[0]
cnt += 1
cnt
est supérieur à 0cnt
est supérieur à 0cnt
de 1Le résultat net est que cnt
sera toujours sera supérieur à 0 et la boucle ne se terminera jamais.
+=
est l'opérateur d'addition in-place .
C'est la même chose que de faire cnt = cnt + 1
. Par exemple:
>>> cnt = 0
>>> cnt += 2
>>> print cnt
2
>>> cnt += 42
>>> print cnt
44
L'opérateur est souvent utilisé de la même manière que l'opérateur ++
dans les langages C-ish, pour incrémenter une variable d'une unité dans une boucle (i += 1
).
Il existe des opérateurs similaires pour la soustraction/multiplication/division/puissance et autres:
i -= 1 # same as i = i - 1
i *= 2 # i = i * 2
i /= 3 # i = i / 3
i **= 4 # i = i ** 4
L'opérateur +=
fonctionne également sur les chaînes, par exemple:
>>> s = "Hi"
>>> s += " there"
>>> print s
Hi there
Les gens ont tendance à ne pas le faire pour des raisons de performances, mais pour la plupart des scripts, ce n'est pas vraiment un problème. Pour citer les docs "Sequence Types" :
- Si s et t sont tous les deux des chaînes, certaines implémentations de Python telles que CPython peuvent généralement effectuer une optimisation sur place pour les assignations de la forme s = s + t ou s + = t. Le cas échéant, cette optimisation rend le temps d’exécution quadratique beaucoup moins probable. Cette optimisation dépend à la fois de la version et de la mise en œuvre. Pour le code sensible aux performances, il est préférable d'utiliser la méthode str.join (), qui garantit des performances de concaténation linéaire cohérentes d'une version à l'autre et d'une implémentation.
La méthode str.join () fait référence à ce qui suit:
mysentence = []
for x in range(100):
mysentence.append("test")
" ".join(mysentence)
.. au lieu de la plus évidente:
mysentence = ""
for x in range(100):
mysentence += " test"
Le problème avec ce dernier est (mis à part l'espace de début), en fonction de l'implémentation Python, l'interpréteur Python devra créer une nouvelle copie de la chaîne en mémoire chaque fois que vous l'ajoutez (car les chaînes sont immuables), lentement, plus la chaîne à ajouter est longue, plus lente est longue. Considérant que l'ajout à une liste, puis sa réunion dans une chaîne est une vitesse constante (quelle que soit la mise en oeuvre)
Si vous manipulez des chaînes de base, ne vous en faites pas. Si vous voyez une boucle qui consiste simplement à ajouter une chaîne, envisagez de construire un tableau, puis "".join()
'.