python: как работает привязка

Я пытаюсь понять, как именно работает привязка переменных в python. Давайте посмотрим на это:

def foo(x):
    def bar():
        print y
    return bar

y = 5
bar = foo(2)
bar()

Это печатает 5, что мне кажется разумным.

def foo(x):
    def bar():
        print x
    return bar
x = 5
bar = foo(2)
bar()

Это печатает 2, что странно. В первом примере python ищет переменную во время выполнения, во втором - при создании метода. Почему это так?

Чтобы было ясно: это очень круто и работает именно так, как я бы хотел. Однако я не понимаю, как функция внутренней панели получает свой контекст. Я хотел бы понять, что происходит под капотом.

EDIT

Я знаю, что локальные переменные имеют больший приоритет. Мне любопытно, как python узнает во время выполнения, что нужно принимать аргумент от функции, которую я вызвал ранее. bar был создан в foo , а x больше не существует. Он привязал этот x к значению аргумента при создании функции?

10
задан ayusha 23 April 2018 в 14:26
поделиться