Изменяемый объект можно менять на месте, неизменяемый — нет. list и dict разрешены как аргументы по умолчанию, но создаются один раз при определении функции и затем разделяются между вызовами.
В чем разница между изменяемыми (mutable) и неизменяемыми (immutable) типами данных в Python? Почему нельзя использовать изменяемые типы, например list или dict, в качестве аргументов по умолчанию в функциях?
Изменяемый объект можно менять на месте, неизменяемый — нет. list и dict разрешены как аргументы по умолчанию, но создаются один раз при определении функции и затем разделяются между вызовами.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Изменяемый объект можно менять на месте, неизменяемый — нет. list и dict разрешены как аргументы по умолчанию, но создаются один раз при определении функции и затем разделяются между вызовами.
Поэтому непреднамеренное накопление данных исправляют так:
def add_item(value, items=None):
if items is None:
items = []
items.append(value)
return items
Если передан существующий список, эта функция намеренно его изменяет. Иногда общий изменяемый default используют осознанно, но скрытое разделение состояния обычно опасно. Переприсваивание переменной новому объекту отличается от изменения старого объекта, на который могут ссылаться другие переменные.