Pourquoi l'appel d'une méthode de chaîne Python ne fait rien à moins que vous n'assigniez sa sortie?


136

J'essaie de faire un simple remplacement de chaîne, mais je ne sais pas pourquoi cela ne semble pas fonctionner:

X = "hello world"
X.replace("hello", "goodbye")

Je veux changer le mot hello en goodbye, donc il devrait changer la chaîne "hello world"en "goodbye world". Mais X reste juste "hello world". Pourquoi mon code ne fonctionne-t-il pas?

Réponses:


232

En effet, les chaînes sont immuables en Python .

Ce qui signifie que X.replace("hello","goodbye")renvoie une copie de Xavec les remplacements effectués . Pour cette raison, vous devez remplacer cette ligne:

X.replace("hello", "goodbye")

avec cette ligne:

X = X.replace("hello", "goodbye")

De manière plus générale, cela est vrai pour toutes les méthodes de chaîne Python qui « en place » changent le contenu d'une chaîne , par exemple replace, strip, translate, lower/ upper, join...

Vous devez assigner leur sortie à quelque chose si vous voulez l'utiliser et ne pas le jeter, par exemple

X  = X.strip(' \t')
X2 = X.translate(...)
Y  = X.lower()
Z  = X.upper()
A  = X.join(':')
B  = X.capitalize()
C  = X.casefold()

etc.


1
Point pédantique: les chaînes peuvent être mutées pour x += 'a'des cas particuliers, par exemple stackoverflow.com/a/40996908/6260170
Chris_Rands

@Chris_Rands: On dirait que vous avez raison, mais de l'extérieur, cela n'a pas d'effet réel de mutabilité - certaines implémentations vérifient si cela est vraiment utilisé, et sinon (donc la mutabilité ne serait pas observée), elle muterait en fait. Est-ce vrai?
Tadeck

@Tadeck Eh bien, je pense que c'est réel mais c'est simplement une optimisation CPython et pas directement pertinent ici (c'est pourquoi j'ai dit que j'étais pédant)
Chris_Rands

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.