> Что произойдет при попытке изменить символ строки по индексу в 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 лучше подходит список символов.

Пример кода

PYTHON
s = "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. Игнорировать вопросы производительности при частых модификациях.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью