Почему вызов метода строки Python ничего не делает, если вы не назначите его вывод?


136

Я пытаюсь сделать простую замену строки, но я не знаю, почему она не работает:

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

Я хочу изменить слово helloна goodbye, поэтому оно должно изменить строку "hello world"на "goodbye world". Но Х просто остается "hello world". Почему мой код не работает?

Ответы:


232

Это потому что строки неизменны в Python .

Это означает, что X.replace("hello","goodbye")возвращает копию Xс произведенными заменами . Из-за этого вам нужно заменить эту строку:

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

с этой строкой:

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

В более широком смысле, это верно для всех строковых методов Python , что изменить содержимое струны «на месте» , например replace, strip, translate, lower/ upper, join...

Вы должны назначить их вывод чему-либо, если хотите использовать его, а не выбрасывать, например

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

и так далее.


1
Точка педантичности: струны могут быть видоизменены для x += 'a'особого случая, например stackoverflow.com/a/40996908/6260170
Chris_Rands

@Chris_Rands: Похоже, вы правы, но со стороны это не имеет реального эффекта изменчивости - некоторые реализации проверяют, действительно ли это используется, и если нет (то есть изменчивость не будет соблюдаться), она фактически будет мутировать. Это правда?
Tadeck

@Tadeck Ну, я думаю, что это реально, но это просто оптимизация CPython и не имеет прямого отношения к этому (вот почему я сказал, что я педантичен)
Chris_Rands

0

Все строковые функции , как lower, upper, stripвозвращается строка без изменения оригинала. Если вы попытаетесь изменить строку, как вы думаете well it is an iterable, она потерпит неудачу.

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

Есть хорошее чтение о важности неизменяемости строк: почему строки Python неизменяемы? Лучшие практики для их использования

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.