где Python хранит глобальные и локальные переменные? - PullRequest
1 голос
/ 20 февраля 2012

Почти так же, как вопрос Где хранятся локальные, глобальные, статические, авто, регистры, extern, const, volatile переменные? , разница в том, что этот поток спрашивает, как язык Python реализует это.

1 Ответ

3 голосов
/ 20 февраля 2012

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

...