¿Por qué no llamar nada a un método de cadena de Python a menos que asignes su salida?

Intento hacer un reemplazo de cadena simple, pero no sé por qué no parece funcionar:

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

Quiero cambiar la palabra hello a goodbye , por lo que debería cambiar la cadena "hello world" a "goodbye world" . Pero X sigue siendo "hello world" . ¿Por qué mi código no funciona?

Related of "¿Por qué no llamar nada a un método de cadena de Python a menos que asignes su salida?"

Esto se debe a que las cadenas son inmutables en Python .

Lo que significa que X.replace("hello","goodbye") devuelve una copia de X con los reemplazos realizados . Por eso necesitas reemplazar esta línea:

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

con esta linea:

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

En términos más generales, esto es cierto para todos los métodos de cadena de Python que cambian el contenido de una cadena “en el lugar” , por ejemplo, replace , strip , translate , lower / upper , join , …

Debe asignar su salida a algo si desea usarlo y no desecharlo, por ejemplo,

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

y así.

Todas las funciones de cadena como lower , upper , strip devuelven una cadena sin modificar el original. Si intenta modificar una cadena, como podría pensar well it is an iterable , fallará.

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

Hay una buena lectura sobre la importancia de que las cuerdas sean inmutables: ¿por qué son inmutables las cuerdas de Python? Mejores prácticas para usarlas