Я пытаюсь понять, как именно работает привязка переменных в 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
к значению аргумента при создании функции?