Ответ
В Python пространство имен (namespace) — это система, которая обеспечивает уникальность имен объектов (переменных, функций, классов). Можно представить его как словарь, где ключами являются имена, а значениями — сами объекты.
Python использует несколько пространств имен, и поиск переменной происходит по правилу LEGB:
- L (Local) — Локальное пространство имен. Создается при вызове функции и содержит имена, определенные внутри нее. Уничтожается при выходе из функции.
- E (Enclosing) — Пространство имен замыкающих функций. Актуально для вложенных функций.
- G (Global) — Глобальное пространство имен текущего модуля. Существует в течение всей жизни модуля.
- 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"))
Такая система позволяет избегать конфликтов имен и логически организовывать код в изолированных областях.