Мутабельность и иммутабельность

Тема дорожной карты · Python Programming

Одни объекты Python меняются на месте (list, dict, set, большинство пользовательских классов), другие — нет (int, float, str, tuple, frozenset, bytes). Эта разница объясняет огромный класс багов: передача списка в функцию неожиданно меняет данные у вызывающего, классическая ловушка с изменяемым значением по умолчанию (def f(xs=[])), почему неизменяемые типы хэшируемы и годятся в ключи dict, почему существует dataclass(frozen=True). На практике: копируй перед изменением общих входных данных, используй tuple/frozenset для ключей и предпочитай неизменяемые типы для констант модуля.

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

Python — язык с динамической и строгой типизацией: переменные — это имена, связанные с объектами, а не типизированные «коробки». У каждого значения есть тип (int, str, bool, None, пользовательские классы), проверяемый в рантайме; нельзя сложить строку с числом без явного приведения. Числа — целые произвольной точности + IEEE 754 float + native complex; строки — неизменяемые Unicode-последовательности. Мутабельность и иммутабельность обеспечивают операции байткода, а не внешний type checker.

Когда применять

Прочное понимание Мутабельность и иммутабельность обязательно до любого нетривиального Python: любой баг рано или поздно сводится к непонятому приведению типа, путанице str-vs-bytes или неожиданной мутации. Опирайтесь на type(), isinstance() и mypy для статической проверки, когда кодовая база переваливает ~1000 строк или у неё несколько авторов. Type hints (PEP 484) стоят дёшево и многократно окупаются в поддерживаемости.

Типичные ошибки

Типичные ошибки в Мутабельность и иммутабельность: путаница == (равенство значений) и is (тождество); сравнение float через == вместо math.isclose(); предположение, что None, 0, "", [] ведут себя одинаково в if x: (все falsy, но иногда это маскирует баг); мутация значений по умолчанию (def f(x=[]) — список общий между вызовами). Читайте PEP 8 и Zen of Python (import this) сразу — идиомы существуют не зря.

Связанные понятия

Полезные ресурсы

Проверить знания (1)

Загрузка вопросов…