Как ответить
Изменяемый (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).