Что такое 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() можно безопасно использовать для изменения глобальных переменных, но лучше это делать осознанно и редко.

  • Использование этих функций может привести к непредсказуемым ошибкам, если делать это без понимания области видимости.