Что такое globals() и locals()?
globals и locals возвращают словари глобальных и локальных переменных. Локальные - это например, те, что находятся в области видимости функции или метода. Глобальные доступны отовсюду.
Но я не могу просто так взять и не упомянуть какую-нибудь особенность.
В globals также присутствуют импортированные модули.
import json
myglobals = globals()
print(f'{myglobals=}\n\r')
j = myglobals['json']
print(j)
print(type(j)) # Всё в Python является объектом, и модуль тоже.
>>> <module 'json' from '/usr/lib/python3.8/json/init.py'>
>>> <class 'module'>
Давайте посмотрим в локальные и глобальные переменные.
a = 15
def test():
····a = 1 # Эта 'a' - в locals
····print(a)
test()
print(a) # Эта - глобальная, она и останется ==15
>>> myglobals={'name': 'main', 'doc': None, 'package': None, 'loader': <_frozen_importlib_external.SourceFileLoader object at 0x7fdb99a471c0>, 'spec': None, 'annotations': {}, 'builtins': <module 'builtins' (built-in)>, 'file': 'ex15.py', 'cached': None, 'json': <module 'json' from '/usr/lib/python3.8/json/init.py'>, 'myglobals': {...}}
>>> 1
>>> 15
Есть такое правило, по которому резолвятся имена, в английском оно называется LEGB. Local - Enclosing - Global - Builtins. То есть, локальные, нелокальные/вложенные (когда функция внутри другой функции), глобальные и встроенные.
В приведенном примере можно сказать, что глобальная переменная a затеняется локальной переменной a. Это такой термин, "затенение переменной". Затеняется она, естественно, внутри функции.
Если мы хотим использовать глобальную переменную в функции, об этом нужно сообщить, дописав 'global a' после определения функции - так код будет более понятным. Если же просто убрать строку 'a = 1', функция тоже будет использовать глобальную переменную, т.к. интерпретатор, не имея локальной 'a', пойдет дальше по правилу LEGB и найдёт ту 'a', которую мы и имели в виду. Глобальную в нашем случае.
Это кросспост из моего Telegram-канала "Не Ван Россум", где я прямо сейчас пишу сериал "101 вопрос про Python" с описанием подводных камней, неочевидностей и загвоздок.