Por que chamar um método de string Python não faz nada, a menos que você atribua sua saída?


136

Eu tento fazer uma substituição simples de string, mas não sei por que não parece funcionar:

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

Eu quero mudar a palavra hellopara goodbye, portanto, deve mudar a string "hello world"para "goodbye world". Mas X apenas permanece "hello world". Por que meu código não está funcionando?

Respostas:


232

Isso ocorre porque as strings são imutáveis ​​no Python .

O que significa que X.replace("hello","goodbye")retorna uma cópia Xcom as substituições feitas . Por isso, você precisa substituir esta linha:

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

com esta linha:

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

Mais amplamente, isso é verdade para todos os métodos de string Python que mudam o conteúdo de uma string "in-place" , por exemplo replace, strip, translate, lower/ upper, join...

Você deve atribuir a saída deles a algo se quiser usá-lo e não jogá-lo fora, por exemplo

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

e assim por diante.


1
Ponto pedante: seqüências de caracteres podem ser modificadas para x += 'a'um caso especial, por exemplo, stackoverflow.com/a/40996908/6260170 #
Chris_Rands

@ Chris_Rands: Parece que você está certo, mas de fora ele não tem um efeito real de mutabilidade - algumas implementações verificam se isso é realmente usado, e se não (então, a mutabilidade não seria observada), ela seria realmente alterada. Isso é verdade?
Tadeck

@Tadeck Bem, eu acho que é real, mas é apenas uma otimização CPython e não diretamente relevante aqui (é por isso que eu disse que eu estava sendo pedante)
Chris_Rands

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.