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

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

Область видимости определяет, откуда видно имя. Python ищет его по правилу LEGB: сначала в локальной области текущей функции, затем во внешних функциях (enclosing), потом в глобальной области модуля и в конце — среди встроенных имён. Как только имя найдено на одном уровне, поиск прекращается.

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

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