#python-3.x
#python-3.x
Вопрос:
Я знаю, что переменная — это просто тег для объекта, пример num = 10, num становится тегом / ссылкой, 10 становится объектом, хранящимся в памяти кучи, где сохраняется num?
Комментарии:
1. Не стесняйтесь просматривать исходный код cpython, если вам интересно разобраться в этих вещах самостоятельно . Вы также можете получить лучшее представление о том, как работает управление памятью вашей программы, поиграв с
dis
в REPL.2. Обратите внимание, что python не дает никаких гарантий относительно расположения памяти. Вы спрашиваете о конкретной реализации? Вы спрашиваете о имени num, ссылочном num или о значении num?
3. номер ссылки в cpython. значение num, которое я знаю, хранится как объект в куче. Хранится ли ссылочное число внутри стека?
Ответ №1:
В конечном счете, это тоже в памяти кучи; либо:
- Это глобальная, и в этом случае ее имя заканчивается как ключ в
dict
, содержащем глобальные переменные модуля, со значением, хранящим ссылку на фактический объект, или - Это локальная переменная, и в этом случае «имя» описывается в самих метаданных функции, а ссылка на значение попадает в массив локальных ссылок, хранящихся в объекте frame, выделяемом при входе в функцию (и обычно освобождается при возврате функции, хотя замыкания и трассировки, инициируемые исключениями, могут привести к тому, что фрейм будет длиться дольше срока службы самого вызова функции). Фактический байт-код на самом деле не использует имя, он преобразуется в индекс в массив локальных данных для ускорения, но тот же индекс может извлекать имя для целей отладки из метаданных функции.
Поскольку dict
s, функции и фреймы все распределены в куче, привязка к имени в конечном счете находится в памяти, выделенной в куче.
Комментарии:
1. Чтобы было понятно, я описываю реализацию CPython (ссылочный интерпретатор Python), которая может не транслироваться напрямую другим интерпретаторам, например, концепция фреймов CPython не является универсальной. Однако ограничения спецификации языка привели бы к аналогичным конструкциям в других реализациях.