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?

Katherina
la source

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.

Tadeck
la source
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
0

Toutes les fonctions de chaîne comme lower, upper, stripreviennent une chaîne sans modifier l'original. Si vous essayez de modifier une chaîne, comme vous pourriez le penser well it is an iterable, cela échouera.

x = 'hello'
x[0] = 'i' #'str' object does not support item assignment

Il y a une bonne lecture sur l'importance des chaînes immuables: Pourquoi les chaînes Python sont-elles immuables? Bonnes pratiques pour les utiliser

user1767754
la source