Что такое globals() и locals()?
Функции globals() и locals() в Python используются для получения информации о пространствах имён (namespace) — то есть о всех переменных, функциях и объектах, которые доступны в определённой области видимости. Эти функции возвращают словари с текущими именами и их значениями.
Разберём каждую максимально подробно, с объяснениями, примерами и разницей между ними.
🔷 Что такое globals()?
📌 Определение:
Функция globals() возвращает словарь всех глобальных переменных и функций, доступных в текущем модуле.
-
Это всё, что находится на уровне файла (вне функций и классов).
-
Глобальное пространство имён — это то, что создаётся при запуске скрипта.
🔍 Пример:
x = 10
def my_func():
print(globals()) # покажет {'x': 10, 'my_func': <function ...>, ...}
my_func()
🧠 Что включает globals():
-
глобальные переменные,
-
импортированные модули,
-
определённые функции и классы,
-
всё, что определено вне функций.
🔷 Что такое locals()?
📌 Определение:
Функция locals() возвращает словарь всех локальных переменных, доступных в текущей области видимости (например, внутри функции).
-
Если вызвать locals() внутри функции, то ты получишь все локальные переменные функции.
-
Если вызвать locals() вне функции, результат будет похож на globals(), но он может быть не точной копией — зависит от контекста.
🔍 Пример:
def example():
a = 5
b = 10
print(locals()) # {'a': 5, 'b': 10}
example()
🔄 Разница между globals() и locals()
Характеристика | globals() | locals() |
---|---|---|
Область видимости | Глобальный уровень | Локальный (обычно внутри функции) |
--- | --- | --- |
Что возвращает | Все глобальные переменные | Все переменные текущей области видимости |
--- | --- | --- |
Когда использовать | Для доступа/изменения глобальных имен | Для отладки или динамики внутри функций |
--- | --- | --- |
Изменение значений | Работает (можно менять) | Не рекомендуется менять locals() вручную |
--- | --- | --- |
⚙️ Как использовать globals() и locals() на практике?
✅ Получение значения по имени переменной:
x = 42
name = 'x'
print(globals()\[name\]) # Вывод: 42
✅ Динамическое создание переменной:
globals()\['new_var'\] = 100
print(new_var) # Вывод: 100
⚠️ Но: с locals() нельзя так делать безопасно:
def test():
locals()\['z'\] = 99
print(z) # Ошибка! z не определена на самом деле.
test()
👉 Почему? Потому что словарь locals() может быть копией, а не живым пространством имён.
🧪 Что будет, если вызвать их вне функции?
a = 10
print(locals() == globals()) # True (вне функций они совпадают)
🧬 Пример со встроенными переменными:
print(globals().keys()) # Показать все глобальные имена
Вывод может содержать:
dict_keys(['_name_', '_doc_', '_package_', '_loader_', '_spec_', '_annotations_', '_builtins_', 'x', 'my_func'])
🎓 Полезно для:
-
отладки программ;
-
написания интерпретаторов, шаблонизаторов, конфигураторов;
-
метапрограммирования (например, при динамическом создании переменных);
-
реализации REPL-подобного поведения.
⚠️ Важные замечания:
-
locals() — не изменяй вручную. Это небезопасно, особенно в функциях.
-
globals() можно безопасно использовать для изменения глобальных переменных, но лучше это делать осознанно и редко.
-
Использование этих функций может привести к непредсказуемым ошибкам, если делать это без понимания области видимости.