куча и стек в переменной python

#python-3.x

#python-3.x

Вопрос:

Я знаю, что переменная — это просто тег для объекта, пример num = 10, num становится тегом / ссылкой, 10 становится объектом, хранящимся в памяти кучи, где сохраняется num?

Комментарии:

1. Не стесняйтесь просматривать исходный код cpython, если вам интересно разобраться в этих вещах самостоятельно . Вы также можете получить лучшее представление о том, как работает управление памятью вашей программы, поиграв с dis в REPL.

2. Обратите внимание, что python не дает никаких гарантий относительно расположения памяти. Вы спрашиваете о конкретной реализации? Вы спрашиваете о имени num, ссылочном num или о значении num?

3. номер ссылки в cpython. значение num, которое я знаю, хранится как объект в куче. Хранится ли ссылочное число внутри стека?

Ответ №1:

В конечном счете, это тоже в памяти кучи; либо:

  1. Это глобальная, и в этом случае ее имя заканчивается как ключ в dict , содержащем глобальные переменные модуля, со значением, хранящим ссылку на фактический объект, или
  2. Это локальная переменная, и в этом случае «имя» описывается в самих метаданных функции, а ссылка на значение попадает в массив локальных ссылок, хранящихся в объекте frame, выделяемом при входе в функцию (и обычно освобождается при возврате функции, хотя замыкания и трассировки, инициируемые исключениями, могут привести к тому, что фрейм будет длиться дольше срока службы самого вызова функции). Фактический байт-код на самом деле не использует имя, он преобразуется в индекс в массив локальных данных для ускорения, но тот же индекс может извлекать имя для целей отладки из метаданных функции.

Поскольку dict s, функции и фреймы все распределены в куче, привязка к имени в конечном счете находится в памяти, выделенной в куче.

Комментарии:

1. Чтобы было понятно, я описываю реализацию CPython (ссылочный интерпретатор Python), которая может не транслироваться напрямую другим интерпретаторам, например, концепция фреймов CPython не является универсальной. Однако ограничения спецификации языка привели бы к аналогичным конструкциям в других реализациях.