Являются ли строки в Python изменяемыми или неизменяемыми
Что проверяют
Понимаете ли вы разницу между изменяемыми и неизменяемыми типами и умеете ли вывести из неё практические следствия. Ответ «неизменяемые» это половина балла, вторая половина за то, что из него вытекает: где строка годится ключом, почему склейка в цикле дорогая и почему методы строк ничего не правят на месте.
Как отвечать
Строки неизменяемы. Присвоить символ по индексу нельзя, любая операция возвращает новый объект, а прежний остаётся как был.
s = "Hello"
s[0] = "h" # TypeError: 'str' object does not support item assignment
s.replace("H", "h") # вернёт новую строку, s не изменится
s = "h" + s[1:] # имя переставлено на новый объект
parts = []
for chunk in chunks:
parts.append(chunk)
text = "".join(parts)Дальше три следствия, которые и нужны интервьюеру. Строка хешируема, поэтому годится ключом словаря и элементом множества, в отличие от списка, а хеш считается один раз и запоминается. Строку безопасно передавать куда угодно, включая потоки: испортить её снаружи невозможно. И за это платят аллокациями: каждое «изменение» это новый объект, поэтому текст собирают через join, а не накоплением в цикле.
Когда нужна именно изменяемая последовательность, берут список символов со сборкой через join, io.StringIO для потокового накопления или bytearray, если работа идёт с байтами.
Где спотыкаются
Вызывают метод и не присваивают результат: s.strip() отдельной строкой не делает ничего. Ошибку потом ищут в данных, а не в коде, хотя она видна глазами.
Собирают строку в цикле через += и оправдываются тем, что в CPython есть оптимизация, дописывающая на месте. Она действительно есть, но работает, только пока на строку нет других ссылок, спецификацией не гарантирована и пропадает на другой реализации языка. Надёжный ответ всегда join.
Проверяют равенство через is, потому что на литералах оно совпадает с ==. Интернирование коротких строк это деталь реализации: строка, собранная в рантайме или прочитанная из файла, даст False. Сюда же путаница имени и объекта: переприсвоить переменную можно всегда, неизменяем объект, а не имя.