Ответ
В Python разделение на изменяемые (mutable) и неизменяемые (immutable) типы — это фундаментальная концепция, влияющая на поведение объектов, передачу аргументов в функции и управление памятью.
Неизменяемые типы (immutable): int, float, str, tuple, bool, frozenset, bytes.
- После создания объект нельзя изменить. Любая операция, которая выглядит как изменение, на самом деле создает новый объект.
- Это делает их потокобезопасными и предсказуемыми при использовании в качестве ключей словаря.
a = "Hello" b = a # `b` ссылается на тот же объект, что и `a` a += " World" # Создается НОВЫЙ строковый объект для `a` print(a) # 'Hello World' print(b) # 'Hello' (старый объект не изменился)
Изменяемые типы (mutable): list, dict, set, bytearray, пользовательские классы (по умолчанию).
- Содержимое объекта можно изменить после создания, не создавая новый объект.
- Требуют осторожности, особенно при передаче в функции или использовании значений по умолчанию.
def append_to_list(item, target_list=[]): # ОПАСНО: изменяемый аргумент по умолчанию! target_list.append(item) return target_list
Лучшая практика — использовать None
def append_to_list_safe(item, target_list=None): if target_list is None: target_list = [] target_list.append(item) return target_list
**Практическое следствие:** При передаче неизменяемого объекта в функцию вы не можете изменить оригинал. При передаче изменяемого — можете, что может быть как полезным (изменение коллекции на месте), так и источником трудноуловимых багов.