Что означает ошибка TypeError: 'str' object does not support item assignment
easy

Что означает ошибка TypeError: 'str' object does not support item assignment

Ошибка из другого языка

Представим такое: студент только что окончил школу, где изучал Паскаль. В универе на лабораторной по 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)

Художник:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Олег Вешкурцев

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Вам может быть интересно
Как сгенерировать нейросетью любые картинки
Как сгенерировать нейросетью любые картинки

А также каким будет Half-Life 3

medium
Как сделать колесо фортуны на сайте
Как сделать колесо фортуны на сайте

Достаточно одного скрипта и немного CSS

medium
Как сделать красивый сайт на Вордпрессе
Как сделать красивый сайт на Вордпрессе

Быстрее, чем экспресс-дизайн. Дешевле, чем экспресс-дизайн. Лучше, чем экспресс-дизайн.

medium
Интеграл в математике: что это и как его понять
Интеграл в математике: что это и как его понять

(и в программировании)

medium
Что означает ошибка TypeError: string indices must be integers
Что означает ошибка TypeError: string indices must be integers

Ошибка на внимательность из мира строк в Python

easy
Игра «Собери пирамиду»
Игра «Собери пирамиду»

Трёхмерная игра с реалистичной физикой

hard
Как с помощью CSS задавать размеры элементов на сайте
Как с помощью CSS задавать размеры элементов на сайте

Шпаргалка по единицам измерения для начинающих верстальщиков

easy
Прокачиваем асинхронное программирование на Python: используем контекстный менеджер
Прокачиваем асинхронное программирование на Python: используем контекстный менеджер

Берём хаос под контроль

hard
Что означает ошибка SyntaxError: non-default argument follows default argument
Что означает ошибка SyntaxError: non-default argument follows default argument

Аргументы функции идут не в том порядке

easy
easy