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

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

Резюме: Передача мусорных объектов в качестве аргументов по умолчанию приводит к неожиданным выходам, потому что Python инициализирует мультиптурный объект по умолчанию только один раз, а не (как вы, возможно, ожидали) каждый раз, когда вызывается функция. Чтобы исправить это, инициализируйте сочетный аргумент по умолчанию с ключевым словом None в списке аргументов, а затем инициализируйте его в функции. … Мультипликационный аргумент по умолчанию в Python Подробнее »

Автор оригинала: Shubham Sayon.

Резюме: Проходящие аргументы по умолчанию, поскольку аргументы по умолчанию приводят к неожиданным выходам, потому что Python инициализирует мультиптурный объект по умолчанию только один раз, а не (как вы, возможно, ожидали) каждый раз, когда вызывается функция. Чтобы исправить это, инициализируйте мультипликационный аргумент по умолчанию с Нет Ключевое слово в списке аргументов, а затем инициализируйте его внутри функции. Это приводит к тому, что сметный аргумент по умолчанию будет инициализирован только в каждом выполнении функций.

Обзор

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

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

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

Путаница 🤔.

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

Пример: Рассмотрим данный фрагмент, приведенный ниже.

def confused(a, e=[]):
    e.append(a)
    return e

# Using function the first time
print(confused(10))
# Using function the second time
print(confused(20))

Выход (ожидание VS Reality ):

Вы можете попробовать сами в интерактивной оболочке Python:

Таким образом, между ожидаемым выходом и выработкой разницы между ожидаемым выходом и выходом. Теперь, что приводит нас к некоторым из самых важных понятий, которые нам нужно знать, чтобы понять, почему это происходит.

Следующие концепции необходимо иметь в виду при работе с функциями и смежными типами данных в Python:

  1. Музные объекты против неизменных объектов.
  2. Пройти по ссылке объекта в Python.

У нас уже есть статья, которая обсуждает концепцию прохода по ссылке на объект, и я настоятельно рекомендую вам посмотреть, следуя этой ссылке.

Давайте обсудим разницу между A Музейный объект и неизменный объект в питоне.

Музные против неизменных объектов

Поскольку все рассматривается как объект в Python, каждая переменная имеет соответствующий экземпляр объекта. Следовательно, всякий раз, когда создается переменная определенного типа, назначается уникальный идентификатор объекта. Тип переменной (который является объектом в Python) определен во время выполнения и не может быть изменен; Тем не менее, Состояние переменной может быть изменено, если оно смещаемое Отказ Но если переменная является неизменный объект, мы не можем изменить его состояние.

В таблице указаны список смежных и неизменных объектов, доступных в Python.

Теперь это делает нашу жизнь спокойной и причиной, по которой мы получаем неожиданный выход, становится самосвязкой! Вот …| Причина, почему вариация произошла на выходе: –

Причина

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

Вы можете проверить состояние аргумента по умолчанию, используя __defaults__ кортеж, как показано в программе ниже.

def confused(a, e=[]):
    e.append(a)
    print("State of e[] = {0} for function call no. {1}".format(confused.__defaults__,len(e)))
    return (e)

# Using function the first time
print("Output Function_Call 1: ",confused(10))
# Using function the second time
print("Output Function_Call 2: ",confused(20))

Выход:

State of e[] = ([10],) for function call no. 1
Output Function_Call 1:  [10]
State of e[] = ([10, 20],) for function call no. 2
Output Function_Call 2:  [10, 20]

Решение

К счастью, решение довольно просто. Мы можем использовать Нет вместо мультипликационного аргумента/объекта по умолчанию, а затем назначьте значение для мультипликационного объекта в локальном объеме функции. Итак, теперь вы можете проверить значения для Нет Вместо того, чтобы непосредственно назначить их вомирующему объекту, который является списком в нашем случае.

Давайте посмотрим на следующую программу, чтобы понять, как мы можем решить нашу проблему:

def confused(a, e=None):
    if e is None:
      e = []
    e.append(a)
    return e

# Using function the first time
print(confused(10))
# Using function the second time
print(confused(20))

Выход:

[10]
[20]

Нет это ключевое слово . в Python, который обозначает нулевое значение. Вы можете рассмотреть Нет так же, как 0, ложь или пустая строка. Тип Нет это Нет сам.

Путаница с закрытиями и поздним привязкой

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

def func(msg):
    def foo():
        print(msg)
    foo()
func("Finxter")

В вышеуказанном коде очевидно функция foo () зависит от переменной Msg вне его объема. Следовательно, это пример закрытия.

Вещи становятся небольшим сложным и запутанным, когда речь идет о поздней привязке закрытия. Python-Guide утверждает, что:

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

Вот пример:

def table():
    return [lambda x : i*x for i in range(1,6)]

print([a(2) for a in table()])

Желаемый выход VS Ожидаемый выход:

Причина:

Дисперсия на выходе состоит в том, что функция лямбда не получает значение Я до тех пор, пока для петли закончил исполнение. Таким образом, когда ценность Я передается на функцию лямбда, это 4 каждый раз. Следовательно, результат является [2 * 5, 2 * 5, 2 * 5, 2 * 5, 2 * 5] Отказ

Решение:

Решением является привязка закрытия к аргументам немедленно, создавая аргумент по умолчанию, как показано ниже:

def multiply():
    return [lambda x,arg=i : arg*x for i in range(1,6)]

print([a(2) for a in multiply()])
[2, 4, 6, 8, 10]

Вывод

Ключевые вынос из этой статьи:

  1. Разница между мулюмами и неизменными объектами.
  2. Путаница с мультиваторными аргументами по умолчанию в Python.
  3. Использование Нет Чтобы разрешить нежелательные выходы при работе с музейными аргументами.
  4. Путаница с закрытиями в лямбдасе.
  5. Привязка замыкания к аргументу по умолчанию для разрешения нашей проблемы.

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

Куда пойти отсюда?

Достаточно теории, давайте познакомимся!

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

Практические проекты – это то, как вы обостряете вашу пилу в кодировке!

Вы хотите стать мастером кода, сосредоточившись на практических кодовых проектах, которые фактически зарабатывают вам деньги и решают проблемы для людей?

Затем станьте питоном независимым разработчиком! Это лучший способ приближения к задаче улучшения ваших навыков Python – даже если вы являетесь полным новичком.

Присоединяйтесь к моему бесплатным вебинаре «Как создать свой навык высокого дохода Python» и посмотреть, как я вырос на моем кодированном бизнесе в Интернете и как вы можете, слишком от комфорта вашего собственного дома.

Присоединяйтесь к свободному вебинару сейчас!

Я профессиональный Python Blogger и Content Creator. Я опубликовал многочисленные статьи и создал курсы в течение определенного периода времени. В настоящее время я работаю полный рабочий день, и у меня есть опыт в областях, таких как Python, AWS, DevOps и Networking.

Вы можете связаться со мной @: