Что такое пространства имен в Python и как они работают

Ответ

В Python пространство имен (namespace) — это система, которая обеспечивает уникальность имен объектов (переменных, функций, классов). Можно представить его как словарь, где ключами являются имена, а значениями — сами объекты.

Python использует несколько пространств имен, и поиск переменной происходит по правилу LEGB:

  1. L (Local) — Локальное пространство имен. Создается при вызове функции и содержит имена, определенные внутри нее. Уничтожается при выходе из функции.
  2. E (Enclosing) — Пространство имен замыкающих функций. Актуально для вложенных функций.
  3. G (Global) — Глобальное пространство имен текущего модуля. Существует в течение всей жизни модуля.
  4. B (Built-in) — Встроенное пространство имен. Содержит встроенные функции и исключения (len, print, str и т.д.). Загружается при запуске интерпретатора.

Когда вы обращаетесь к переменной, Python ищет ее имя последовательно в этих пространствах: Local → Enclosing → Global → Built-in. Поиск останавливается на первом найденном совпадении.

Пример, демонстрирующий правило LEGB:

x = "global"  # G: Глобальная область видимости

def outer_func():
    x = "enclosing"  # E: Замыкающая область для inner_func

    def inner_func():
        x = "local"  # L: Локальная область
        print(f"Внутри inner_func: x = {x}")  # Находит 'local'

    inner_func()
    print(f"Внутри outer_func: x = {x}")  # Находит 'enclosing'

outer_func()
print(f"В глобальной области: x = {x}")    # Находит 'global'

# Пример поиска во встроенной области
# 'len' не определен в L, E или G, поэтому Python находит его в B (Built-in)
print(len("test"))

Такая система позволяет избегать конфликтов имен и логически организовывать код в изолированных областях.