内部功能函数 - 每一次?(Function inside function - every tim

2019-08-31 07:16发布

让我们有这样的代码:

def big_function():
    def little_function():
         .......
    .........

Python的文件说,大约def语句:

函数定义是一个可执行语句。 它的执行绑定功能名称...

所以,问题是:是否def little_function()执行每当big_function被调用? 问题是关于def的语句完全相同,而不是little_function()身上。

Answer 1:

您可以检查与字节码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的叫法),但是这并不会增加太多的开销。



Answer 2:

在内部功能的代码被编译一次,所以不应该有一个显著运行处罚。

只有内部的功能闭包的每个外部函数被调用时更新。 见这里 ,例如,关于关闭更多细节。

这里有一个快速演示,检查关闭:

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


文章来源: Function inside function - every time?