> Что произойдет при попытке изменить символ строки по индексу в Python и почему (Go)
Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Wildberries
Стек: Go
> Пример ответа
Короткий ответ
В Python строки являются immutable, поэтому попытка изменить символ по индексу вызовет TypeError. Это не связано с ограничениями памяти или производительностью, а является осознанным дизайнерским решением. Строки хешируемы, потокобезопасны и могут использоваться как ключи словаря. Для изменения нужно создать новую строку.
Подробное объяснение
Строки в Python реализованы как неизменяемые последовательности Unicode code points. При попытке присваивания по индексу интерпретатор немедленно выбрасывает исключение, не выполняя операцию. Это гарантирует, что после создания строки её хеш и содержимое никогда не изменятся. В отличие от Go, где строки также неизменяемы, но можно получить срез и изменить байты через []byte, в Python такой прямой возможности нет. Immutability даёт несколько преимуществ: строки можно кешировать, использовать в качестве ключей в dict и set, безопасно передавать между потоками без блокировок. Кроме того, это упрощает оптимизации в CPython, например, интернирование коротких строк. Однако за это приходится платить: любое изменение требует создания новой строки, что может быть дорого при частых модификациях. Для таких случаев используют bytearray, list символов или io.StringIO.
На практике
В бэкенд-разработке на Go вы привыкли, что строки неизменяемы, но можно работать с []byte или strings.Builder. В Python аналогично: для частых изменений строки используют bytearray (если данные в ASCII/UTF-8) или list, а затем ''.join(). Например, при парсинге или генерации больших текстов это критично для производительности. Также важно помнить, что str в Python 3 - это Unicode, а не байты, поэтому bytearray работает с байтами, а не с символами. Для посимвольной обработки Unicode лучше подходит список символов.
Пример кода
PYTHONs = "hello"try:s[0] = 'H'except TypeError as e:print(e) # 'str' object does not support item assignment# Правильные способы:s2 = 'H' + s[1:] # создание новой строкиs3 = list(s)s3[0] = 'H's4 = ''.join(s3) # 'Hello'# Для байтов:ba = bytearray(b"hello")ba[0] = ord('H')print(ba) # bytearray(b'Hello')
Как отвечать на собеседовании
Сначала чётко скажите, что строки в Python immutable, поэтому будет TypeError. Затем объясните причину: хешируемость, потокобезопасность, возможность использования в качестве ключей. Упомяните, что это дизайнерское решение, а не баг. Приведите альтернативы: конкатенация, bytearray, list + join, io.StringIO. Если собеседник спрашивает про Go, отметьте сходство: строки тоже неизменяемы, но есть []byte и strings.Builder. Покажите, что понимаете trade-off между иммутабельностью и производительностью.
Что проверяет интервьюер
Понимание модели данных Python, а не просто заучивание факта. Способность объяснить, почему это решение принято, и какие последствия оно имеет для производительности и безопасности. Умение предложить идиоматичные альтернативы для изменения строк. Знание различий между str, bytes и bytearray. Навык сравнивать с другими языками (Go) и адаптировать ответ под контекст бэкенда.
Типичные ошибки
Говорить, что строки изменяемы, но это не рекомендуется. Путать TypeError с SyntaxError или IndexError. Утверждать, что можно изменить строку через срез, например s[0:1] = 'H' - это тоже вызовет ошибку. Забывать, что bytearray работает с байтами, а не с Unicode-символами. Предлагать s[0] = 'H' с использованием memoryview - это не сработает для str. Игнорировать вопросы производительности при частых модификациях.
> Похожие задачи по Go
Приведите пример улучшения процессов тестирования в команде
Какие типы данных для древовидных структур поддерживаются в PostgreSQL
Что такое временная сложность алгоритмов и как она измеряется
Насколько глубоко вы погружались в Kubernetes и через какие инструменты его использовали
> Похожие задачи по backend
Приведите пример улучшения процессов тестирования в команде
Какие типы данных для древовидных структур поддерживаются в PostgreSQL
Что такое временная сложность алгоритмов и как она измеряется
Насколько глубоко вы погружались в Kubernetes и через какие инструменты его использовали
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью