1Какие встроенные типы данных есть в Python и какие из них изменяемые?
В Python есть скалярные типы NoneType, bool, int, float и complex; текстовые и бинарные типы str, bytes и bytearray; последовательности list, tuple и range; коллекции dict, set и frozenset. Ключевое различие для собеседования — mutability: list, dict, set и bytearray меняются на месте, а числа, bool, str, bytes, tuple, range, frozenset и None неизменяемы. Важный нюанс: tuple неизменяем как контейнер, но может хранить ссылки на изменяемые объекты.
2Чем list, tuple, set и dict отличаются в реальном коде?
list — упорядоченная изменяемая последовательность, удобная для накопления результатов и данных, которые меняются. tuple — упорядоченная неизменяемая структура для фиксированных записей и возврата нескольких значений. set хранит уникальные hashable-объекты и подходит для membership checks и deduplication. dict отображает hashable-ключи в значения и обычно используется для индексов, lookup и JSON-подобных данных. В современных версиях dict сохраняет порядок вставки, но его главная роль — доступ по ключу.
3Чем is отличается от ==?
== проверяет равенство по значению, обычно через __eq__. is проверяет идентичность: две ссылки указывают на один и тот же объект. В production-коде is обычно используют для singleton-проверок, например value is None, или для специальных sentinel-объектов. Нельзя полагаться на кеширование маленьких чисел или interning строк: в маленьких примерах is может случайно сработать, но семантически это неправильная проверка.
4Что такое hashable-объект и почему это важно?
Hashable-объект имеет стабильный hash на протяжении жизни и равенство, согласованное с этим hash. Это важно, потому что ключи dict и элементы set зависят от hash. Большинство неизменяемых built-ins hashable, но неизменяемый контейнер не делает вложенные объекты hashable автоматически: tuple со списком внутри не hashable. Если объект используется как ключ, поля, определяющие его идентичность, не должны меняться после вставки.
5Как работают срезы, отрицательные индексы и шаг?
Срез sequence[start:stop:step] включает start, исключает stop и движется с шагом step. Пропущенные границы выбираются в зависимости от направления шага. Отрицательные индексы считаются с конца, поэтому s[-1] — последний элемент. Отрицательный step идет справа налево, а s[::-1] возвращает перевернутую последовательность. Нужно помнить, что срез часто создает новый объект, поэтому он выразительный, но не бесплатный на больших данных.