Из всех перечисленных Python имеет только «локальные», «глобальные» и «нелокальные» переменные.
Некоторые из них хранятся в объекте типа «Словарь» или словарь, к которому обычно можно обращаться явно.
«global» : На самом деле «глобальные» переменные являются глобальными относительнок модулю, в котором они определены - иногда они называются переменными «уровня модуля» вместо глобальных, поскольку большинство зол использования глобальных переменных в C не применимы - поскольку ни у кого не будет ни конфликтов имен, ни не будетзнать, откуда произошло определенное имя при использовании глобальной переменной уровня модуля.
Их значение хранится в словаре, доступном как атрибут "__dict__" объекта модуля.Важно отметить, что все имена в модуле хранятся таким образом - поскольку имена в Python указывают на любой объект: то есть на уровне языка не проводится различий между «переменными», функциями или классами вмодуль: имена для всех этих объектов будут ключами в специальном атрибуте "__dict__", к которому непосредственно обращается язык.Да, можно вставлять или изменять объекты, на которые указывают переменные, в модуле во время выполнения с помощью обычного «setattr» или даже напрямую изменять __dict__ модуля.
«local» : Localпеременные доступны из словаря пользователя в словаре, возвращаемом вызовом встроенной функции locals ().На этот словарь ссылается атрибут "f_locals" текущего кадра кода, который выполняется.Поскольку существуют способы получения кодовой рамки функций, которые вызвали текущий выполняемый код, можно извлечь значения переменных, доступных в этих функциях, с помощью атрибута f_locals, хотя в реализации CPython изменение значения в словаре f_locals не будетотразить значения всех действующих переменных в рабочем коде - эти значения кэшируются механизмом байт-кода.
"нелокальный" Переменные - это специальные ссылки внутри функции к переменным, определенным в внешней области видимости, в случае функций (или другого кода, такого как тело класса), определенных внутри функции.Их можно получить в исполняемом коде, получив атрибут func_closure - который является кортежем объектов «cell».Например, чтобы получить значение первой нелокальной переменной внутри объекта функции, нужно выполнить следующее: _ function.func_closure[0].cell_contents
- значения хранятся отдельно от имен переменных, которые можно получить как function.func_code.co_varnames
.(эта схема именования действительна для Python 2.x)
Итог: переменные «значения» всегда хранятся внутри объектов, которые совместимы с объектами Python и управляются виртуальной машиной.Некоторые из этих данных можно сделать программно доступными с помощью интроспекции - некоторые из них непрозрачны.(Например, с помощью самоанализа извлекать нелокальные переменные из функции, которой они принадлежат, немного сложно)