我对一些人可能认为是一个基本问题的道歉.在以下简单代码中:
def greet(name): def say_hi(): print('Preparing to greet...') print('Hi', name, '!') print('Greeting given.') return say_hi
当使用形式参数调用'greet'并且解释器遇到'say_hi'函数时,事件序列是什么.我看到对它的引用被返回(形成一个我假设的闭包?),但是内部函数是执行还是只是'读'而不是在程序员编写如下代码之前调用它:
f = greet('Caroline') f()
Kasramvd.. 6
因为python中的每一件事都是关于运行时的(除了编译时间任务,如窥视优化器等),除非你调用它,否则python不会调用你的函数.
您可以通过使用module中的dis
函数来查看此行为,该函数dis
返回函数的相对字节码:
>>> def greet(name):
... def say_hi():
... print('Preparing to greet...')
... print('Hi', name, '!')
... print('Greeting given.')
... return say_hi
...
>>> import dis
>>>
>>> dis.dis(greet)
2 0 LOAD_CLOSURE 0 (name)
3 BUILD_TUPLE 1
6 LOAD_CONST 1 (", line 2>)
9 MAKE_CLOSURE 0
12 STORE_FAST 1 (say_hi)
6 15 LOAD_FAST 1 (say_hi)
18 RETURN_VALUE
正如您在第6部分中看到的那样,python只是将函数作为CONST值中的代码对象加载.
因为python中的每一件事都是关于运行时的(除了编译时间任务,如窥视优化器等),除非你调用它,否则python不会调用你的函数.
您可以通过使用module中的dis
函数来查看此行为,该函数dis
返回函数的相对字节码:
>>> def greet(name):
... def say_hi():
... print('Preparing to greet...')
... print('Hi', name, '!')
... print('Greeting given.')
... return say_hi
...
>>> import dis
>>>
>>> dis.dis(greet)
2 0 LOAD_CLOSURE 0 (name)
3 BUILD_TUPLE 1
6 LOAD_CONST 1 (", line 2>)
9 MAKE_CLOSURE 0
12 STORE_FAST 1 (say_hi)
6 15 LOAD_FAST 1 (say_hi)
18 RETURN_VALUE
正如您在第6部分中看到的那样,python只是将函数作为CONST值中的代码对象加载.