Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Python: Python, mutable default arguments, function parameters, side effects, common pitfalls

Почему не рекомендуется использовать изменяемые типы в качестве значений по умолчанию в функциях?

Этот вопрос проверяет понимание особенностей работы с изменяемыми типами данных в Python и их влияния на поведение функций, что важно для предотвращения трудноуловимых ошибок.

Короткий ответ

В Python значения по умолчанию для параметров функции вычисляются и создаются только один раз — в момент определения функции, а не при каждом её вызове. Если в качестве значения по умолчанию используется изменяемый объект, например, список или словарь, то один и тот же объект будет использоваться повторно при всех последующих вызовах функции, где этот аргумент не указан явно. Это может привести к неожиданному накоплению данных между вызовами и ошибкам, связанным с общим состоянием. Рекомендуется использовать None в качестве значения по умолчанию, а внутри функции создавать новый изменяемый объект, если аргумент не был передан.

Длинный ответ

В Python параметры функции могут иметь значения по умолчанию, которые используются, если вызывающий код не предоставляет соответствующий аргумент. Ключевая особенность заключается в том, что эти значения по умолчанию вычисляются и создаются в момент определения функции (когда интерпретатор встречает def), а не при каждом её вызове. Это поведение является оптимизацией, но для изменяемых (mutable) типов данных, таких как списки, словари или множества, оно приводит к неочевидным последствиям.

Проблема с общим состоянием

Поскольку объект-значение по умолчанию создаётся один раз, он становится атрибутом самой функции. Если этот объект изменяется внутри функции (например, в список добавляется элемент), то это изменение сохраняется и будет видно в следующем вызове этой же функции. Таким образом, разные вызовы функции начинают неявно разделять одно и то же изменяемое состояние, что противоречит интуиции, ожидающей, что каждый вызов начинается с "чистого" значения по умолчанию.

Пример проблемного кода

def add_item(item, items_list=[]):
    items_list.append(item)
    return items_list

print(add_item('apple'))  # Вывод: ['apple']
print(add_item('banana')) # Вывод: ['apple', 'banana'] - сюрприз!

Во втором вызове функция вернула список, содержащий элемент из первого вызова, потому что использовался один и тот же объект списка, созданный при определении функции.

Рекомендуемый паттерн: Использование None

Стандартное решение — использовать неизменяемое значение None в качестве значения по умолчанию, а затем внутри функции проверять это и создавать новый изменяемый объект при необходимости.

def add_item_fixed(item, items_list=None):
    if items_list is None:
        items_list = []
    items_list.append(item)
    return items_list

print(add_item_fixed('apple'))  # ['apple']
print(add_item_fixed('banana')) # ['banana'] - теперь корректно

Этот подход гарантирует, что каждый вызов функции, для которого аргумент не был передан явно, получит свой собственный, новый список.

Где это применяется?

Это знание критически важно при проектировании любых функций, которые могут кэшировать данные, накапливать промежуточные результаты или принимать опциональные контейнеры для данных. Особенно часто эта проблема встречается в декораторах, конструкторах классов и функциях, обрабатывающих конфигурации.

Вывод: Всегда используйте None в качестве значения по умолчанию для параметров, которые должны быть изменяемыми объектами, чтобы избежать нежелательного разделения состояния между вызовами функции и сделать её поведение предсказуемым и изолированным.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • Python

    Python

Ключевые слова

#Python

#mutable default arguments

#function parameters

#side effects

#common pitfalls

Подпишись на Python Developer в телеграм