Короткий ответ
Изменяемые типы позволяют менять содержимое объекта после его создания — это списки, словари, множества и другие. Неизменяемые типы — строки, кортежи, числа и другие: их содержимое изменить нельзя, поэтому любая «правка» на самом деле создаёт новый объект.
Как это работает подробнее
Деление определяется возможностью изменять объект «на месте», и оно напрямую влияет на поведение кода.
- Изменяемые объекты. У списка есть методы вроде
appendиsort, которые меняют объект на месте, поэтому все ссылки на него видят изменения. - Неизменяемые объекты. У строки нет методов изменения на месте: конкатенация строк или сложение чисел создаёт новый объект, а старая ссылка перепривязывается.
- Хешируемость. Неизменяемые объекты можно использовать как ключи словаря и элементы множества, а также безопасно передавать в функции — случайно изменить их нельзя.
Что использовать на практике
- Ключи словаря. Для ключей словаря и элементов множества выбирай неизменяемые типы — они хешируемы.
- Накопление данных. Когда коллекцию нужно часто дополнять или перестраивать, используй изменяемые структуры вроде списка.
- Защита от изменений. Если важно уберечь данные от случайной модификации при передаче, отдавай предпочтение неизменяемым объектам.
Подводные камни
- Ссылочное поведение. Изменение изменяемого объекта видно во всех местах, где хранится ссылка на него, что даёт неожиданные побочные эффекты.
- Ошибка изменения. Попытка переприсвоить элемент неизменяемого объекта вызывает ошибку, например
TypeErrorо том, что объект не поддерживает присваивание по индексу.