Dlaczego wywołanie metody łańcuchowej w Pythonie nic nie robi, chyba że przypiszesz jej wyjście?


136

Próbuję wykonać prostą zamianę ciągu, ale nie wiem, dlaczego to nie działa:

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

Chcę zmienić słowo hellona goodbye, dlatego powinien zmienić ciąg "hello world"na "goodbye world". Ale X po prostu pozostaje "hello world". Dlaczego mój kod nie działa?

Odpowiedzi:


232

Dzieje się tak, ponieważ w Pythonie ciągi znaków są niezmienne .

Co oznacza, że X.replace("hello","goodbye")zwraca kopię Xz dokonanymi wymianami . Z tego powodu musisz zamienić tę linię:

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

z tą linią:

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

Szerzej, to jest prawdziwe dla wszystkich metod ciąg Pythona, które zmieniają treść ciąg jest „w miejscu” , na przykład replace, strip, translate, lower/ upper,join ...

Musisz przypisać do czegoś ich wyjście, jeśli chcesz go używać i nie wyrzucać, np

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

i tak dalej.


1
Pedantyczny punkt: łańcuchy mogą być zmutowane do x += 'a'szczególnego przypadku, np stackoverflow.com/a/40996908/6260170
Chris_Rands

@Chris_Rands: Wygląda na to, że masz rację, ale z zewnątrz nie ma to rzeczywistego efektu zmienności - niektóre implementacje sprawdzają, czy jest to naprawdę używane, a jeśli nie (więc zmienność nie byłaby obserwowana), faktycznie mutowałaby. Czy to prawda?
Tadeck

@Tadeck Cóż, myślę, że to jest prawdziwe, ale to tylko optymalizacja CPythona i nie ma tutaj bezpośredniego związku (dlatego powiedziałem, że jestem pedantyczny)
Chris_Rands

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.