Являются ли строки в Python изменяемыми или неизменяемыми?
Что проверяют
Вопрос базовый, но для инженера данных у него есть второе дно: как неизменяемость строк отражается на памяти и скорости обработки таблиц. Формально ответ занимает предложение, поэтому сильный кандидат сразу переводит разговор на хранение строковых столбцов и цену построчных операций.
Как отвечать
Строки в Python неизменяемы: присвоить символ по индексу нельзя, любое преобразование возвращает новый объект.
Дальше то, что важно на данных. Неизменяемость даёт хешируемость, поэтому строка годится ключом словаря, ключом группировки и элементом множества, а хеш вычисляется один раз, что заметно на группировках и соединениях по строковым ключам. Платой идут аллокации: каждое преобразование порождает новый объект, и построчная сборка текста на миллионах записей упирается в память и сборщик мусора.
Отсюда практика: строковые столбцы держат не в универсальном object, где массив хранит указатели на отдельные объекты, а в строковом типе поверх Arrow либо в category, когда уникальных значений немного. Преобразования делают векторно, а результат обязательно присваивают обратно.
df["city"] = df["city"].str.strip().str.lower()
df["city"] = df["city"].astype("category")
text = "".join(parts) # вместо накопления через += в циклеПро распределённую обработку добавьте, что неизменяемость делает строки безопасными для передачи между воркерами: копия не испортит оригинал.
Где спотыкаются
Вызывают строковый метод столбца и не присваивают результат: метод честно вернул новый столбец, а кадр остался прежним. Расхождение находят уже на витрине, когда ключи не сошлись.
Обрабатывают строки построчно, через apply или цикл с накоплением. На больших объёмах это часы вместо минут: каждая операция создаёт новый объект, интерпретатор работает поштучно, а векторные методы и join делают то же самое пачкой.
Переносят неизменяемость строки на контейнеры и считают, что раз со строками всё безопасно, то и с кадром можно обращаться как угодно. Кадры и столбцы изменяемы, а правка среза не обязана доезжать до исходного объекта: pandas переходит на копирование при записи, и код, который держится на побочном эффекте среза, ломается.