Встречается на 28% собеседований по Python

Какие знаешь типы данных в Python

В Python типы данных делятся на изменяемые (mutable) и неизменяемые (immutable). К изменяемым относятся list, dict, set, bytearray, а к неизменяемым — int, float, bool, tuple, frozenset, str. Также выделяют NoneType, bytes и complex, которые занимают особое место. Понимание этой классификации важно для предсказания поведения объектов при их передаче в функции, копировании и использовании в качестве ключей словаря.

Как это работает

Изменяемые объекты можно модифицировать после создания: добавлять или удалять элементы, менять значения. Например, в list можно добавить элемент методом append(), а в dict — присвоить значение по ключу. Неизменяемые объекты, наоборот, нельзя изменить после создания; любая операция, которая кажется изменением, на самом деле создаёт новый объект. Например, конкатенация строк возвращает новую строку, а исходная остаётся без изменений.

Эта разница влияет на:

  • Передачу в функции: изменяемые объекты передаются по ссылке, и изменения внутри функции видны снаружи; неизменяемые — по значению, изменения не влияют на оригинал.
  • Использование в качестве ключей словаря: ключи должны быть неизменяемыми, так как словарь использует хеш-таблицу, и изменение ключа после вставки нарушило бы её целостность.
  • Копирование: для изменяемых объектов нужно использовать copy() или deepcopy(), чтобы избежать неожиданного изменения оригинала.

Примеры типов

КатегорияТипыПримеры
Изменяемыеlist, dict, set, bytearray[1, 2], {'a': 1}, {1, 2}, bytearray(b'abc')
Неизменяемыеint, float, bool, tuple, frozenset, str42, 3.14, True, (1, 2), frozenset({1}), 'hello'
ОсобыеNoneType, bytes, complexNone, b'abc', 1+2j

NoneType — единственный представитель None, обозначает отсутствие значения. bytes — неизменяемая последовательность байтов, а complex — комплексное число, также неизменяемое.

Подводные камни

  • Путаница между tuple и list: tuple неизменяем, но если внутри него лежит изменяемый объект (например, список), то этот объект можно менять. Сам кортеж при этом остаётся неизменным по структуре.
  • frozenset vs set: frozenset — неизменяемая версия set, поэтому может быть ключом словаря, а обычный set — нет.
  • bytearray vs bytes: bytearray изменяем, bytes — нет. Это часто упускают из виду.
  • str — неизменяемый, но операции вроде replace() возвращают новую строку, что может привести к неэффективности при частых модификациях в цикле.

Когда использовать

Выбор типа зависит от задачи:

  • Если нужен изменяемый упорядоченный набор — list.
  • Если нужен неизменяемый упорядоченный набор — tuple (например, для ключей словаря).
  • Если нужна уникальность элементов — set или frozenset.
  • Если нужны пары «ключ-значение» — dict.
  • Для бинарных данных — bytes (неизменяемый) или bytearray (изменяемый).

Коротко

  • Изменяемые: list, dict, set, bytearray.
  • Неизменяемые: int, float, bool, tuple, frozenset, str.
  • Особые: NoneType, bytes, complex.
  • Неизменяемость определяет возможность использования в качестве ключа словаря и поведение при передаче в функции.
как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы