Например:
x
не является свободным в коде 1, поскольку это глобальная переменная. x
не является свободным в bar()
в коде 2, потому что это связанная переменная. x
свободен в foo()
. Python делает это различие из-за закрытия. Свободная переменная не определена в текущей среде, т.е. е. сбор локальных переменных, а также не является глобальной переменной! Поэтому он должен быть определен в другом месте. И это концепция закрытия. В коде 2 foo()
закрывается на x
, определенном в bar()
. Python использует лексическую область. Это означает, что интерпретатор может определить область действия, просто просматривая код.
Например: x
известен как переменная в foo()
, потому что foo()
заключен в bar()
, а x
связан в bar()
.
Глобальная область обрабатывается специально Python. Было бы возможно, чтобы глобальная область рассматривалась как самая внешняя область, но это не сделано из-за производительности (я думаю). Поэтому невозможно, что x
является свободным и глобальным.
Жизнь не так проста. Существуют свободные глобальные переменные. Документы Python (модель исполнения) говорят:
Глобальный оператор имеет ту же область действия, что и операция привязки имени в том же блоке. Если ближайшая закрывающая область для свободной переменной содержит глобальный оператор, свободная переменная рассматривается как глобальная.
blockquote>>>> x = 42 >>> def foo(): ... global x ... def baz(): ... print(x) ... print(locals()) ... baz() ... >>> foo() 42 {}
Я сам этого не знал. Мы все здесь, чтобы учиться.