Объясните правило LEGB для областей видимости в Python

Ответ

Правило LEGB описывает порядок, в котором интерпретатор Python ищет переменные. Это акроним, который расшифровывается как:

  1. L (Local) — Локальная область видимости. Переменные, определенные внутри текущей функции. Поиск начинается здесь.

  2. E (Enclosing) — Область видимости замыкающих функций. Переменные во внешних функциях, если текущая функция вложена в другую. Поиск идет от ближайшей внешней функции к самой дальней.

  3. G (Global) — Глобальная область видимости. Переменные, определенные на верхнем уровне модуля или объявленные с помощью ключевого слова global.

  4. 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) области видимости (не глобальной).