Почему использование переменной в более низкой области изменяет способ разрешения переменной в более высокой области?

#python #scope #disassembly #cpython

#python #область #разборка #cpython

Вопрос:

У меня есть тривиальная функция, которая возвращает свой аргумент, а значение получается с помощью LOAD_FAST инструкции cpython.

 def function1(n):
    return n  # LOAD_FAST for n -- what I expect

dis.dis(function1)
  2           0 LOAD_FAST                0 (n)
              2 RETURN_VALUE
  

Однако добавление лямбда-выражения в тело функции приводит к получению значения с использованием LOAD_DEREF .

 def function2(n):
    return n  # LOAD_DEREF for n -- this is surprising
    lambda: n  # LOAD_DEREF for n -- what I expect

dis.dis(function2)
  2           0 LOAD_DEREF               0 (n)
              2 RETURN_VALUE

Disassembly of <code object <lambda> at 0x..., file "...", line 3>:
  3           0 LOAD_DEREF               0 (n)
              2 RETURN_VALUE
  

Почему поиск n изменяется в более высокой области в зависимости от того n , используется ли она в более низкой (зависимой) области?