¿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?

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í.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.