Подтвердить что ты не робот

Функция внутри функции - каждый раз?

Пусть у нас есть этот код:

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

Документация Python говорит о def:

Определение функции - исполняемый оператор. Его выполнение связывает имя функции...

Итак, вопрос: Выполняется ли def little_function() каждый раз при вызове big_function? Вопрос о инструкции def точно, а не тело little_function().

4b9b3361

Ответ 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), но это не добавляет больших накладных расходов.

Ответ 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