Ответ
Хотя эти понятия тесно связаны, они описывают разные аспекты работы с переменными.
-
Пространство имен (Namespace) — это структура данных, которая хранит имена (переменные, функции) и связывает их с объектами. По сути, это словарь
{'имя': объект}
. В Python существует несколько пространств имен: встроенное (built-in), глобальное, локальное. -
Область видимости (Scope) — это текстовая область в коде, из которой можно напрямую получить доступ к именам из определенного пространства имен. Она определяет правила, по которым Python ищет переменную в разных пространствах имен.
Ключевое правило поиска — LEGB (Local → Enclosing → Global → Built-in):
- L (Local) — локальная область внутри функции.
- E (Enclosing) — область видимости внешней функции (для вложенных функций).
- G (Global) — глобальная область модуля.
- 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 в глобальной области видимости
Итог:
- Пространство имен — это «что» (хранилище имен).
- Область видимости — это «где» (правила доступа к этому хранилищу).