对于一些人可能认为这是一个基本问题,我表示歉意。在以下简单代码中:
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()发布于 2015-12-24 20:00:59
因为python中的每一件事都是关于运行时的(除了编译时任务,比如peephole优化器等等),所以python不调用您的函数,除非您调用它。
通过使用来自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 (<code object say_hi at 0x7fdacc12c8b0, file "<stdin>", 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值中以代码对象的形式加载函数。
https://stackoverflow.com/questions/34457331
复制相似问题