Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Пространства имен в 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