Рубрики
Без рубрики

Музные аргументы по умолчанию в Python

Эта статья изначально была передана в моем блоге. Объекты встроенных типов, таких как (int, float, bool, s … Теги с производительностью, начинающими, Python, учебником.

Эта статья была первоначально разделена на мой блог Отказ

Объекты встроенных типов, такие как (INT, FLOAT, BOOL, STR, TUPLE, Unicode), неизменны. Объекты встроенных типов, таких как (список, набор, DICT), смены. Мультипликационный объект может изменить его состояние или содержимое, а неизменные объекты не могут.

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

Я написал очень простую функцию, как показано ниже –

def foobar(element, data=[]):
    data.append(element)
    return data

В приведенной выше функции я устанавливаю данные в список (Musicable объект) в качестве аргумента по умолчанию. Теперь давайте выполним эту функцию –

>>> print(foobar(12))
[12]

Выход как ожидается, теперь выполняется несколько раз –

>>> print(foobar(22))
[12, 22]
>>> print(foobar(32))
[12, 22, 32]

Что здесь происходит? Как вы можете видеть, первый раз функция возвращает именно то, что мы ожидали. Во втором и все последующие проходит один и тот же список в каждом вызове.

Почему это происходит

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

Итак, давайте сделаем некоторые самоанализ, чтобы очистить смущения, я предпринял несколько строк кода, как показано ниже-

  • Функция перед выполнением –
def foo(l=[]):
    l.append(10)

После выполнения функции выполняется это определение, вы можете проверить атрибут по умолчанию для этой функции. Используя __defaults__ Отказ

О __defaults__ TUPLE, содержащий значения аргумента по умолчанию для этих аргументов, которые имеют значения по умолчанию, или нет, если аргументы не имеют значения по умолчанию.

>>> foo.__defaults__
([],)

Результат пустой список как единственная запись в __defaults__

  • Функция после выполнения

Давайте теперь выполним эту функцию и проверьте значения по умолчанию.

>>> foo()
>>> foo.__defaults__
([10],)

Пораженный? Значение внутри изменения объекта, последовательные вызовы функции теперь просто добавят к этому встроенному объекту списка:

Давайте выполним функцию несколько раз:

>>> foo()
>>> foo()
>>> foo()

>>> foo.__defaults__
([10, 10, 10, 10],)

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

Решение

Теперь вопрос в том, как кодировать foobar Для того, чтобы получить поведение, которое мы ожидали.

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

def foobar(element, data=None):
    if data is None:
        data = []
    data.append(element)
    return data

>>> foobar(12)
[12]

Итак, заменив мультипные аргументы по умолчанию без решаемых нашей проблемы.

Хорошее использование смешанного аргумента по умолчанию

Тем не менее, сочетный аргумент по умолчанию имеет хорошее использование, а также следующее

1. Развивающая локальная переменная к текущему значению внешней переменной в обратном вызове 2.Cache/Memoation

Я надеюсь, что вам нравится объяснение смежных аргументов по умолчанию в Python. Тем не менее, если какие-либо сомнения или улучшение в отношении его, спросите в разделе комментариев.

Список литературы: https://docs.python.org/3/reference/datamodel.html#the-standard-type-hierarchy

Оригинал: “https://dev.to/sharmapacific/mutable-default-arguments-in-python-22ce”