← Назад к вопросам

Какие знаешь пространства имен в Python?

2.3 Middle🔥 171 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пространства имен в Python

Пространство имена (namespace) — это контейнер, который отображает имена объектов на сами объекты. В Python это реализовано через словари (dictionaries), которые связывают строковые имена с объектами в памяти.

Уровни пространств имен

1. Built-in (встроенное)

Содержит встроенные функции, исключения и константы. Доступно глобально везде:

# Built-in функции
print()
len()
isinstance()
# Built-in исключения
ValueError
TypeError
IndexError

2. Global (глобальное)

Охватывает текущий модуль. Создаётся при запуске модуля и существует до его выгрузки:

# global.py
x = 10

def func():
    print(x)  # Ищет в global namespace

func()  # Выведет 10

3. Enclosing (охватывающее)

Возникает в nested функциях. Это scope внешней функции для внутренней:

def outer():
    x = "outer"
    
    def inner():
        print(x)  # Ищет в enclosing namespace
    
    inner()  # Выведет "outer"

outer()

4. Local (локальное)

Область видимости функции. Создаётся при вызове функции:

def func():
    x = "local"  # Local namespace
    print(x)

func()  # Выведет "local"

Правило LEGB

Python ищет переменные в этом порядке:

  • Local — локальная область
  • Enclosing — охватывающая область
  • Global — глобальная область
  • Built-in — встроенная область
x = "global"

def outer():
    x = "enclosing"
    
    def inner():
        x = "local"
        print(x)  # Выведет "local"
    
    inner()

outer()

Работа с пространствами имен

globals() и locals()

x = 10

def func():
    y = 20
    print(locals())   # {"y": 20}
    print(globals())  # {..., "x": 10, ...}

func()

dir() — просмотр имён в пространстве

x = 10

def func():
    pass

print(dir())  # Список всех имён в текущей области

Keyword global и nonlocal

x = 1

def func():
    global x
    x = 2  # Изменит глобальное x

def outer():
    x = 1
    
    def inner():
        nonlocal x
        x = 2  # Изменит x из outer
    
    inner()
    print(x)  # Выведет 2

Пространства имен в классах

class MyClass:
    class_var = "class"  # Namespace класса
    
    def __init__(self):
        self.instance_var = "instance"  # Namespace экземпляра

obj = MyClass()
print(MyClass.__dict__)  # Namespace класса
print(obj.__dict__)      # Namespace экземпляра

Модули как пространства имен

Каждый модуль имеет своё глобальное пространство имён:

# module1.py
x = 1

# module2.py
import module1
print(module1.x)  # Обращение к пространству имён module1