Perché chiamare un metodo stringa Python non fa nulla a meno che non si assegni il suo output?


136

Provo a fare una semplice sostituzione di stringa, ma non so perché non sembra funzionare:

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

Voglio cambiare la parola helloin goodbye, quindi dovrebbe cambiare la stringa "hello world"in "goodbye world". Ma X rimane "hello world". Perché il mio codice non funziona?

Risposte:


232

Questo perché le stringhe sono immutabili in Python .

Ciò significa che X.replace("hello","goodbye")restituisce una copia di Xcon le sostituzioni effettuate . Per questo motivo è necessario sostituire questa riga:

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

con questa linea:

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

Più in generale, questo è vero per tutti i metodi delle stringhe Python che modificano il contenuto di una stringa "in-place" , ad esempio replace, strip, translate, lower/ upper, join, ...

Devi assegnare il loro output a qualcosa se vuoi usarlo e non buttarlo via, ad es

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

e così via.


1
Punto pedante: stringhe può essere mutato per x += 'a'caso speciale, ad esempio stackoverflow.com/a/40996908/6260170
Chris_Rands

@Chris_Rands: sembra che tu abbia ragione, ma dall'esterno non ha un reale effetto di mutabilità - alcune implementazioni controllano se questo è veramente usato, e in caso contrario (quindi non si osserverebbe la mutabilità), in realtà muta. È vero?
Tadeck,

@Tadeck Beh, penso che sia reale ma è solo un'ottimizzazione di CPython e non direttamente pertinente qui (ecco perché ho detto che ero pedante)
Chris_Rands

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.