Область видимости (scope) определяет, где имя «видно» и откуда к нему можно обратиться. Если вы обращаетесь к имени, Python не «угадывает», а ищет его в нескольких пространствах имён в определённом порядке. Нарушение этих правил приводит к ошибкам вроде NameError или неожиданному «перекрытию» переменных.
LEGB: порядок поиска имён
При обращении к имени Python ищет его в таком порядке (LEGB):
Local (L) — локальная область.
Имена, определённые внутри текущей функции или comprehension. Они появляются при вызове функции и исчезают после её завершения.
def func():
x = 10 # локальная переменная
print(x)Enclosing (E) — область внешних функций.
Это области видимости внешних функций для вложенных функций (замыкания).
def outer():
x = "outer"
def inner():
print(x) # берёт x из enclosing-области outer
inner()Global (G) — глобальная область модуля.
Имена, определённые на верхнем уровне файла (модуля). Они доступны во всех функциях модуля (если не перекрыты локальными).
x = "global"
def func():
print(x) # если локального x нет, возьмёт глобальныйBuilt‑in (B) — встроенная область.
Пространство имён, в котором лежат стандартные функции и исключения (len, print, ValueError и т.д.).
Если имя найдено на одном из уровней, поиск останавливается — более внешние области уже не проверяются.
Главные моменты, которые важно уметь проговорить
LEGB — это порядок поиска имени. «Сначала локальная, потом enclosing, потом глобальная, потом встроенная область.» Локальные переменные не видны снаружи функции. Попытка обратиться к ним вне функции даст NameError. Вложенные функции видят переменные внешней функции (enclosing), но не наоборот. Внешняя функция не видит локальные переменные внутренней. Глобальные переменные доступны внутри функций для чтения, но для записи нужно явно объявлять global, а для изменения переменных enclosing‑области — nonlocal.
Область видимости определяет, откуда видно имя. Python ищет его по правилу LEGB: сначала в локальной области текущей функции, затем во внешних функциях (enclosing), потом в глобальной области модуля и в конце — среди встроенных имён. Как только имя найдено на одном уровне, поиск прекращается.