В чем разница между пространством имен и областью видимости в Python

Ответ

Хотя эти понятия тесно связаны, они описывают разные аспекты работы с переменными.

  • Пространство имен (Namespace) — это структура данных, которая хранит имена (переменные, функции) и связывает их с объектами. По сути, это словарь {'имя': объект}. В Python существует несколько пространств имен: встроенное (built-in), глобальное, локальное.

  • Область видимости (Scope) — это текстовая область в коде, из которой можно напрямую получить доступ к именам из определенного пространства имен. Она определяет правила, по которым Python ищет переменную в разных пространствах имен.

Ключевое правило поиска — LEGB (Local → Enclosing → Global → Built-in):

  1. L (Local) — локальная область внутри функции.
  2. E (Enclosing) — область видимости внешней функции (для вложенных функций).
  3. G (Global) — глобальная область модуля.
  4. B (Built-in) — встроенные имена Python (print, len и т.д.).

Пример:

x = 'global_x' # Имя 'x' в глобальном пространстве имен

def outer_func():
    y = 'enclosing_y' # Имя 'y' в локальном пространстве имен outer_func

    def inner_func():
        z = 'local_z' # Имя 'z' в локальном пространстве имен inner_func
        print(x) # Найдено в Global (G)
        print(y) # Найдено в Enclosing (E)
        print(z) # Найдено в Local (L)

    inner_func()

outer_func()
# print(z) # Ошибка! NameError: name 'z' is not defined в глобальной области видимости

Итог:

  • Пространство имен — это «что» (хранилище имен).
  • Область видимости — это «где» (правила доступа к этому хранилищу).