Возвращаемый адрес внутренней функции по сравнению с возвращаемой самой функцией

#python #python-3.x

#python #python-3.x

Вопрос:

В приведенном ниже коде print(first) возвращает адрес first_child функции, что для меня имеет смысл, поскольку parent() функция возвращает ссылку на first_child , а не на first_child саму функцию — то есть parent() возвращает first_child , а не first_child() .

Поскольку возвращается ссылка на first_child функцию, а не сама функция, я не понимаю, почему print(first()) на самом деле возвращается вывод функции first_child — отображается «Привет, я Эмма». Почему / как возможно вызвать first_child() функцию таким образом?

 def parent(num):
    def first_child():
        return "Hi, I am Emma"

    def second_child():
        return "Call me Liam"

    if num == 1:
        return first_child
    else:
        return second_child


first = parent(1)
second = parent(2)

print(first)
print(first())
  

Комментарии:

1. first это не адрес чего-либо, это другое имя функции, которую вы изначально назвали first_child . Итак, неудивительно, что вы получаете ее выходные данные при ее вызове.

2. «Поскольку возвращается ссылка на функцию first_child, а не на саму функцию», в Python такого различия нет. Вы всегда работаете со ссылками на объекты. Функция точно такая же, как любой другой объект.

Ответ №1:

Сначала вам нужно понять, что: В Python функции являются гражданами первого класса. Они могут — и ведут себя — как обычные переменные.

Забудьте все о функциях C или Java. Думайте о функции python как о просто другой переменной — за исключением того, что вы можете ее вызывать — т.е. f() имеет значение для f переменной.

Теперь давайте вернемся к вашему вопросу, parent возвращает first_child или second_child — это как переменные. Теперь, когда вы берете одну из этих переменных и ставите () после них, вызывается переменная. Этот вызов завершается вычислением строк, которые вы определили внутри parent — и, следовательно, вы получаете «Привет, я Эмма»

Вы должны понимать, что «ссылка на функцию» так же хороша, как и «сама функция» в python.

Если вы хотите получить более подробные сведения, ознакомьтесь: https://medium.com/python-pandemonium/function-as-objects-in-python-d5215e6d1b0d