Что такое 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" с описанием подводных камней, неочевидностей и загвоздок.