Представим такое: студент только что окончил школу, где изучал Паскаль. В универе на лабораторной по Python ему дали такое задание: заменить в строке все точки на восклицательные знаки.
Студент помнит, что можно обращаться к отдельным элементам строки, поэтому сразу пишет очевидный цикл:
# исходная строка, где нужно заменить точки
s = 'Привет. Это журнал «Код».'
# делаем цикл, который переберёт все порядковые номера символов в строке
for i in range(len(s)):
# если текущий символ — точка
if s[i] == '.':
# то меняем её на восклицательный знак
s[i] = '!'
Но после запуска компьютер выдаёт ошибку:
❌ TypeError: 'str' object does not support item assignment
Казалось бы, почему? Есть строка, можно обратиться к отдельным символам, цикл в порядке — что не так-то?
Что это значит: интерпретатор сообщает нам, что не может поменять символ в строке один на другой.
Когда встречается: когда в Python мы пытаемся напрямую заменить символ в строке, как это делали в Паскале или некоторых других языках, которые это умеют. В Python строки хоть и состоят из символов, которые можно прочитать по отдельности, но управлять этими символами он не даёт.
Что делать с ошибкой TypeError: 'str' object does not support item assignment
Решение простое: нужно не работать с символами в строке напрямую, а собирать новую строку из исходной. А всё потому, что Python разрешает прибавлять символы к строке, считая их маленькими строками. Этим и нужно воспользоваться:
# исходная строка, где нужно заменить точки
s = 'Привет. Это журнал «Код».'
# строка с результатом
r = ''
# делаем цикл, который переберёт все порядковые номера символов в исходной строке
for i in range(len(s)):
# если текущий символ — точка
if s[i] == '.':
# то в новой строке ставим на её место восклицательный знак
r = r + '!'
else:
# иначе просто переносим символ из старой строки в новую
r = r + s[i]
# выводим результат
print(r)
Но проще всего, конечно, использовать встроенную функцию replace():
# исходная строка, где нужно заменить точки
s = 'Привет. Это журнал «Код».'
# встроенной функцией меняем точки на восклицательные знаки
s = s.replace('.','!')
# выводим результат
print(s)