LEGB: L (Local) — локальная область текущей функции, E (Enclosing) — области внешних функций при вложенных функциях, G (Global) — уровень модуля, B (Built‑in) — встроенные имена вроде len, print.
LEGB: L (Local) — локальная область текущей функции, E (Enclosing) — области внешних функций при вложенных функциях, G (Global) — уровень модуля, B (Built‑in) — встроенные имена вроде len, print.
Область видимости (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, затем глобальная и в конце built‑in. Локальные переменные не видны снаружи функции: если попробовать обратиться к ним вне функции, ты получишь NameError.
Вложенные функции видят переменные внешней функции (enclosing), но не наоборот: внешняя функция не видит локальные переменные внутренней. Глобальные переменные доступны внутри функции для чтения, но для записи нужно явно объявить global, а для изменения переменных enclosing‑области — nonlocal.
В одной фразе: область видимости определяет, откуда видно имя, а Python ищет его по правилу LEGB — Local, Enclosing, Global, Built‑in.
Оцени свой прогресс