让我们有这样的代码:
def big_function():
def little_function():
.......
.........
Python的文件说,大约def
语句:
函数定义是一个可执行语句。 它的执行绑定功能名称...
所以,问题是:是否def little_function()
执行每当big_function
被调用? 问题是关于def
的语句完全相同,而不是little_function()
身上。
让我们有这样的代码:
def big_function():
def little_function():
.......
.........
Python的文件说,大约def
语句:
函数定义是一个可执行语句。 它的执行绑定功能名称...
所以,问题是:是否def little_function()
执行每当big_function
被调用? 问题是关于def
的语句完全相同,而不是little_function()
身上。
您可以检查与字节码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
的叫法),但是这并不会增加太多的开销。
在内部功能的代码被编译一次,所以不应该有一个显著运行处罚。
只有内部的功能闭包的每个外部函数被调用时更新。 见这里 ,例如,关于关闭更多细节。
这里有一个快速演示,检查关闭:
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