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

136

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 helloa goodbye, por lo tanto, debería cambiar la cadena "hello world"a "goodbye world". Pero X solo permanece "hello world". ¿Por qué mi código no funciona?

Katherina
fuente

Respuestas:

232

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

Lo que significa que X.replace("hello","goodbye")devuelve una copia de los Xreemplazos realizados . Por eso necesita 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 las cadenas de Python que cambian el contenido de una cadena "in situ" , por ejemplo replace, strip, translate, lower/ upper, join, ...

Debe asignar su salida a algo si desea usarlo y no tirarlo, 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í.

Tadeck
fuente
1
Punto pedante: las cadenas se pueden mutar para x += 'a'casos especiales, por ejemplo stackoverflow.com/a/40996908/6260170
Chris_Rands
@Chris_Rands: Parece que tienes razón, pero desde afuera no tiene un efecto de mutabilidad real: algunas implementaciones verifican si esto realmente se usa y, de lo contrario (no se observaría la mutabilidad), en realidad mutaría. ¿Es eso cierto?
Tadeck
@Tadeck Bueno, creo que es real, pero es simplemente una optimización de CPython y no es directamente relevante aquí (es por eso que dije que estaba siendo pedante)
Chris_Rands
0

Todas las funciones de cadena como lower, upper, stripestán regresando 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 cadenas sean inmutables: ¿por qué las cadenas de Python son inmutables? Mejores prácticas para usarlos

usuario1767754
fuente