2012-02-20 6 views
-1

Почти такой же вопрос, как вопрос Where are the local, global, static, auto, register, extern, const, volatile variables are stored?. Разница в том, что эта тема задает вопрос о том, как это реализует язык Python.где python хранит глобальные и локальные переменные?

+1

В какой реализации Python вы спрашиваете? CPython? –

+0

@GregS: этот вопрос касается C и Objective C, это о Python. Хотя ни один вопрос не указывает на реализацию, поэтому я предполагаю, что в обоих случаях правильный ответ «это может быть где угодно». – James

+0

Я понимаю, что этот вопрос может быть более сложным, но я не вижу причин, по которым он так сильно занижен. Это «законно», и ответ вообще не зависит от реализации Python. – jsbueno

ответ

3

Из всех, у Python есть только «локальные», «глобальные» и «нелокальные» переменные.

Некоторые из них хранятся в словаре или словаре, подобном объекту, который обычно может быть явно адресован.

«глобальный»: На самом деле «глобальный» переменные являются глобальными по отношению к модулю, где они определены - иногда они называются «уровень модуля» переменные вместо глобал, так как большинство из зол использования глобальных переменных в C не применяются - поскольку у одного из них не будет конфликтов нименования, ни один из них не будет знать, откуда появилось определенное имя при использовании глобальной переменной уровня модуля.

Их значение хранится в словаре, доступном как атрибут «__dict__» объекта модуля. Важно отметить, что все имена в модуле хранятся таким образом - поскольку имена в Python указывают на любой объект akind: то есть на уровне языка нет различия, «переменных», функций или классов в module: имена для всех этих объектов будут ключами в специальном атрибуте «__dict__», к которому напрямую обращается язык. Да, можно вставлять или изменять объекты, указанные переменными в модуле во время выполнения, с обычным «setattr» или даже напрямую изменять __dict__ модуля.

«local»: Локальные переменные доступны в «коде пользователя» в словаре, возвращаемом вызовом функции «locals()». Этот словарь ссылается на атрибут «f_locals» текущего кадра кода. Поскольку существуют способы извлечения фрейма кода из функций, которые вызывают текущий текущий код, можно получить значения переменных, доступных в этих функциях, используя атрибут f_locals, хотя в реализации CPython изменение значения в словаре f_locals не будет отражают действительные значения переменных рабочего кода - эти значения кэшируются машиной байткода.

«nonlocal» Переменные - это специальные ссылки внутри функции для переменных, определенных в области внешнего вида, в случае функций (или другого кода, как тела класса), определенных внутри функции. Их можно получить в запущенном коде, получив атрибут func_closure - который является кортежем «ячеистых» объектов. Например, чтобы получить значение первой нелокальной переменной внутри функционального объекта, выполните следующее: _ function.func_closure[0].cell_contents - значения хранятся отдельно от имен переменных, которые могут быть получены как function.func_code.co_varnames. (эта схема именования действительна для Python 2.x)

Нижняя строка: переменные значения всегда хранятся внутри объектов, совместимых с объектами Python и управляемых виртуальной машиной. Некоторые из этих данных могут быть сделаны программно доступными через интроспекцию - некоторые из них непрозрачны. (Например, извлечение, посредством самоанализа, нелокальных переменных изнутри функции, которая им владеет сама по себе, немного сложнее)

+0

Хороший ответ. Однако мое понимание того, как местные жители работают в CPython, заключается в том, что они хранятся в массиве C (в объекте фрейма) и доступны с целым индексом, а не с строковым ключом. Более того, словарь, возвращаемый 'locals()', использует кешированные значения, чем наоборот. – Dunes

+0

Это хранилище, которое вы описываете, является тем, которое я называю «кэшированным машиной байткода» в ответе выше. – jsbueno

Смежные вопросы