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?

Katherina
fonte

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.

Tadeck
fonte
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
0

Todas as funções de cadeia como lower, upper, stripestão retornando uma string sem modificar o original. Se você tentar modificar uma string, como você pode pensar well it is an iterable, ela falhará.

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

Há uma boa leitura sobre a importância das strings serem imutáveis: Por que as strings Python são imutáveis? Práticas recomendadas para usá-los

user1767754
fonte