Что такое область видимости переменных (LEGB)?

Область видимости переменной — это участок кода, в пределах которого имя доступно. В Python поиск имени идёт по правилу 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.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге