Автор оригинала: 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:
- Музные объекты против неизменных объектов.
- Пройти по ссылке объекта в 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]
Вывод
Ключевые вынос из этой статьи:
- Разница между мулюмами и неизменными объектами.
- Путаница с мультиваторными аргументами по умолчанию в Python.
- Использование
Нет
Чтобы разрешить нежелательные выходы при работе с музейными аргументами. - Путаница с закрытиями в лямбдасе.
- Привязка замыкания к аргументу по умолчанию для разрешения нашей проблемы.
Я надеюсь, что вы нашли эту статью полезную, и она помогла вам получить лучшее представление о функциях и подменных аргументах. Пожалуйста, подпишитесь и оставайся настроенными для интересных статей.
Куда пойти отсюда?
Достаточно теории, давайте познакомимся!
Чтобы стать успешным в кодировке, вам нужно выйти туда и решать реальные проблемы для реальных людей. Вот как вы можете легко стать шестифункциональным тренером. И вот как вы польские навыки, которые вам действительно нужны на практике. В конце концов, что такое использование теории обучения, что никто никогда не нуждается?
Практические проекты – это то, как вы обостряете вашу пилу в кодировке!
Вы хотите стать мастером кода, сосредоточившись на практических кодовых проектах, которые фактически зарабатывают вам деньги и решают проблемы для людей?
Затем станьте питоном независимым разработчиком! Это лучший способ приближения к задаче улучшения ваших навыков Python – даже если вы являетесь полным новичком.
Присоединяйтесь к моему бесплатным вебинаре «Как создать свой навык высокого дохода Python» и посмотреть, как я вырос на моем кодированном бизнесе в Интернете и как вы можете, слишком от комфорта вашего собственного дома.
Присоединяйтесь к свободному вебинару сейчас!
Я профессиональный Python Blogger и Content Creator. Я опубликовал многочисленные статьи и создал курсы в течение определенного периода времени. В настоящее время я работаю полный рабочий день, и у меня есть опыт в областях, таких как Python, AWS, DevOps и Networking.
Вы можете связаться со мной @: