Почти такой же вопрос, как вопрос Where are the local, global, static, auto, register, extern, const, volatile variables are stored?. Разница в том, что эта тема задает вопрос о том, как это реализует язык Python.где python хранит глобальные и локальные переменные?
ответ
Из всех, у 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 и управляемых виртуальной машиной. Некоторые из этих данных могут быть сделаны программно доступными через интроспекцию - некоторые из них непрозрачны. (Например, извлечение, посредством самоанализа, нелокальных переменных изнутри функции, которая им владеет сама по себе, немного сложнее)
Хороший ответ. Однако мое понимание того, как местные жители работают в CPython, заключается в том, что они хранятся в массиве C (в объекте фрейма) и доступны с целым индексом, а не с строковым ключом. Более того, словарь, возвращаемый 'locals()', использует кешированные значения, чем наоборот. – Dunes
Это хранилище, которое вы описываете, является тем, которое я называю «кэшированным машиной байткода» в ответе выше. – jsbueno
- 1. Python глобальные и локальные переменные
- 2. Глобальные и локальные переменные
- 3. глобальные и локальные переменные заблуждением
- 4. JS Глобальные и локальные переменные
- 5. Глобальные и локальные переменные JavaScript
- 6. Рекурсивные функции и глобальные и локальные переменные
- 7. Локальные и глобальные переменные в javascript
- 8. Локальные переменные, дающие глобальные проблемы
- 9. локальные и глобальные переменные в JS
- 10. Переменные типы глобальные, статические, локальные и автоматические
- 11. Глобальные и локальные переменные в моем скрипте
- 12. Локальные и глобальные переменные в JavaScript
- 13. Локальные и глобальные переменные внутри функции Javascript
- 14. Глобальные и локальные переменные в R
- 15. C локальные и глобальные статические переменные
- 16. Локальные и глобальные переменные в Swift
- 17. Получить все глобальные переменные/локальные переменные в интерфейсе python gdb
- 18. Javascript локальные переменные в глобальные переменные
- 19. Глобальные переменные, не действующие как локальные переменные?
- 20. Где статические локальные переменные go
- 21. PYTHON: как избежать циклической зависимости и объединить локальные + глобальные переменные
- 22. Javascript - Где разместить константы, глобальные или локальные?
- 23. Эффективны ли глобальные или локальные переменные?
- 24. javascript хранит глобальные переменные в DOM
- 25. Локальные переменные и функции Python
- 26. Локальные глобальные переменные VS в Java
- 27. Связанные списки - глобальные v. Локальные переменные
- 28. Python: sys.exc_info() отсутствует локальные переменные
- 29. Когда возникают локальные переменные python?
- 30. Где nodejs хранит свои переменные?
В какой реализации Python вы спрашиваете? CPython? –
@GregS: этот вопрос касается C и Objective C, это о Python. Хотя ни один вопрос не указывает на реализацию, поэтому я предполагаю, что в обоих случаях правильный ответ «это может быть где угодно». – James
Я понимаю, что этот вопрос может быть более сложным, но я не вижу причин, по которым он так сильно занижен. Это «законно», и ответ вообще не зависит от реализации Python. – jsbueno