Ответ
Правило LEGB описывает порядок, в котором интерпретатор Python ищет переменные. Это акроним, который расшифровывается как:
-
L (Local) — Локальная область видимости. Переменные, определенные внутри текущей функции. Поиск начинается здесь.
-
E (Enclosing) — Область видимости замыкающих функций. Переменные во внешних функциях, если текущая функция вложена в другую. Поиск идет от ближайшей внешней функции к самой дальней.
-
G (Global) — Глобальная область видимости. Переменные, определенные на верхнем уровне модуля или объявленные с помощью ключевого слова
global. -
B (Built-in) — Встроенная область видимости. Предопределенные в Python имена:
len,str,print,Exceptionи т.д. Это последняя область, где производится поиск.
Пример, демонстрирующий все уровни:
# G: Global scope
x = "global"
def outer_func():
# E: Enclosing scope
x = "enclosing"
def inner_func():
# L: Local scope
x = "local"
print(f"Внутри inner_func: {x}") # Находит 'local'
# len - пример из Built-in scope
print(f"Длина строки: {len(x)}")
inner_func()
print(f"Внутри outer_func: {x}") # Находит 'enclosing'
outer_func()
print(f"На глобальном уровне: {x}") # Находит 'global'
# Вывод:
# Внутри inner_func: local
# Длина строки: 5
# Внутри outer_func: enclosing
# На глобальном уровне: global
Ключевые слова global и nonlocal
По умолчанию Python позволяет только читать переменные из внешних областей видимости. Для их изменения используются специальные ключевые слова:
global x: Указывает, что внутри функции мы хотим изменить переменнуюxиз глобальной (G) области видимости.nonlocal y: Указывает, что мы хотим изменить переменнуюyиз ближайшей замыкающей (E) области видимости (не глобальной).