ENIGMA AI
ENIGMA AI

Что такое «изменяемый тип» (mutable) в Python и как он реализован в языке?

встречается 1× Python junior language_specific

Как ответить

Изменяемый (mutable) тип в Python — это такой объект, который можно менять после создания: добавлять, удалять или заменять элементы, не меняя его идентификатор в памяти. В отличие от неизменяемых (immutable) типов (int, str, tuple, frozenset), изменяемый объект остаётся тем же самым объектом, меняется только его внутреннее состояние.

Классические примеры: list, dict, set, bytearray. Реализуется это через ссылочную модель CPython. У каждого объекта есть заголовок (заголовок PyObject), который хранит тип и счётчик ссылок. Для изменяемых типов в структуре объекта есть указатели на динамические массивы или хеш-таблицы. Методы вроде list.append() или dict.update() модифицируют эту внутреннюю память, не создавая нового объекта.

a = [1, 2, 3]
print(id(a))  # 140735233123456
a.append(4)
print(id(a))  # 140735233123456 — тот же id

b = (1, 2, 3)
print(id(b))  # 140735233123789
b = b + (4,)
print(id(b))  # 140735233124567 — новый объект

Важное следствие: изменяемый объект передаётся в функцию по ссылке. Если внутри функции его менять, изменения увидят и снаружи — если только не создать копию. Ключи словарей и элементы set могут быть только immutable (или hashable), поэтому list нельзя использовать как ключ.

Ещё один нюанс — смешанный случай: tuple сам по себе неизменяем, но если он содержит list, то элементы этого list можно изменить. То есть неизменяема структура кортежа, но не содержимое изменяемых вложенных объектов.

На практике мутабельность даёт гибкость и производительность (не нужно копировать большие данные), но требует осторожности при параллельных операциях или когда нужно гарантировать неизменяемость. Для защиты используют copy.deepcopy или специальные immutable-обёртки (например, MappingProxyType для dict).

Ключевые тезисы

  • Mutable-объект можно изменить после создания, его идентификатор (id) остаётся прежним.
  • Типичные mutable-типы: list, dict, set, bytearray; все остальные (int, str, tuple, frozenset) — immutable.
  • В CPython изменения реализуются через модификацию внутренних структур данных (массивов, хеш-таблиц) по указателям.
  • Изменяемость влияет на передачу по ссылке в функциях и на возможность использования объекта в качестве ключа словаря.
  • Tuple неизменяем, но может содержать mutable-элементы — тогда содержимое этих элементов можно менять.

Что спросят дальше

  • — Почему нельзя использовать list как ключ словаря, и как это связано с мутабельностью?
  • — Как сделать изменяемый объект временно неизменяемым (например, для передачи в функцию)?
  • — Что такое «заморозка» (freeze) для set и есть ли аналог для dict?

Готовьтесь к собеседованию с ENIGMA AI

AI-суфлёр подсказывает ответы прямо на собеседовании в реальном времени — незаметно для интервьюера.

Скачать приложение