我们有这个代码:
def big_function():
def little_function():
.......
.........
Python文档说明了def
语句:
函数定义是可执行语句。它的执行绑定 功能名称......
所以,问题是:
每次调用def little_function()
时big_function
都会执行吗?
问题与def
语句完全相同,而不是little_function()
正文。
答案 0 :(得分:31)
您可以使用dis
模块检查字节码:
>>> import dis
>>> def my_function():
... def little_function():
... print "Hello, World!"
...
...
>>> dis.dis(my_function)
2 0 LOAD_CONST 1 (<code object little_function at 0xb74ef9f8, file "<stdin>", line 2>)
3 MAKE_FUNCTION 0
6 STORE_FAST 0 (little_function)
9 LOAD_CONST 0 (None)
12 RETURN_VALUE
正如您所看到的,内部函数的代码是编译仅一次。每次调用my_function
时都会加载它并创建一个新的函数对象(在这种意义上,每次调用def little_function
时都会执行my_function
,但是这不会增加太多开销。
答案 1 :(得分:9)
内部函数中的代码只编译一次,因此不应该有明显的运行时惩罚。
每次调用外部函数时,只有内部函数闭包才会更新。例如,有关闭包的更多详细信息,请参阅here。
这是一个快速演示,检查关闭:
def f(x):
a = []
b = x + 1
def g():
print a, b
return g
In [28]: y = f(5)
In [29]: y
Out[29]: <function __main__.g>
In [30]: y.func_closure
Out[30]:
(<cell at 0x101c95948: list object at 0x101c3a3f8>,
<cell at 0x101c958a0: int object at 0x100311aa0>)
In [31]: y.func_closure[1].cell_contents
Out[31]: 6