web-dev-qa-db-fra.com

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

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, il devrait donc changer la chaîne "hello world" à "goodbye world". Mais X reste juste "hello world". Pourquoi mon code ne fonctionne pas?

132
Katherina

C'est parce que les chaînes sont immuables en Python.

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

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

avec cette ligne:

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

Plus généralement, ceci vaut pour toutes les méthodes Python qui modifient le contenu d'une chaîne "sur place", par exemple, replace, strip, translate, lower/upper, join, ...

Vous devez assigner leur sortie à quelque chose si vous voulez l’utiliser et ne pas la jeter, par ex.

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

etc.

229
Tadeck

Toutes les fonctions de chaîne telles que lower, upper, strip renvoient 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, ça va échouer.

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

Il existe une bonne lecture sur l’importance que les chaînes soient immuables: Pourquoi les chaînes Python sont-elles immuables? Les meilleures pratiques pour les utiliser

0
user1767754