Глава 8 · Играем с буквами и словами

Строки нельзя изменить

Строку невозможно поменять «на месте» — но можно построить новую. Разберём, почему это так и как это влияет на все методы строк.

Строку нельзя изменить «на месте»

Может показаться, что раз мы умеем доставать символ по индексу (word[0]), то можно и заменить его тем же способом. Это не так — строки в Python неизменяемы (immutable):

popytka_izmenit.py
word = "Cat"
word[0] = "B"
# TypeError: 'str' object does not support item assignment
Почему так странно?
Это осознанное устройство языка, а не ограничение. Неизменяемые строки проще и безопаснее передавать между разными частями программы — можно быть уверенным, что никакая другая часть кода «незаметно» не поменяет ваш текст, пока вы с ним работаете. Мы ещё вернёмся к этой идее в главе про списки, которые, наоборот, изменяемы.

Правильный способ: создать новую строку

Вместо изменения «на месте» строим НОВУЮ строку — из кусочков старой — и сохраняем её в переменную (можно в ту же самую):

pravilnyj_sposob.py
word = "Cat"
word = "B" + word[1:]     # склеиваем "B" с "at" — получаем новую строку
print(word)                # Bat

Именно поэтому все методы строк — upper(), replace() и другие (разделы 8.9–8.10) — не меняют исходную строку, а возвращают новую. Если результат нужно сохранить, его нужно явно присвоить переменной:

metody_ne_menyayut.py
text = "python"
text.upper()          # результат создан, но никуда не сохранён — и потерян!
print(text)            # python — исходная строка не изменилась

text = text.upper()   # а вот так — сохранили результат обратно в text
print(text)            # PYTHON
★ Базовая практика
Замена первой буквы

Для строки «home» постройте новую строку «dome», заменив первый символ через срез и конкатенацию — так, как показано выше для «Cat» → «Bat».

Практика: неизменяемость строк
Тот же ноутбук, что и в разделе «Срезы строки» — он охватывает и эту тему
Открыть практику →