Модель памяти Python для этой программы

1

Мой запрос находится в нижеприведенной программе относительно символов, которые хранят значения и функции при запуске http://pythontutor.com/.

Изображение 174551

Мой вопрос:

  • Как выглядит модель выполнения python над программой выше в памяти перед началом интерпретации программы python? Как визуализировать этот макет памяти? например, c исполняемый файл имеет сегменты кода/стека/кучи/дополнительные/данные, как пример, я не сравниваю

  • Является ли 'const' именем области памяти 32/64 бит, сохраняющей значение 2 с типом, назначенным как целое?

  • add()/sub()/другие функции отображаются в столбце Objects в соответствии с диаграммой. Итак, как я воспринимаю функции, хранящиеся как объекты? Как это визуализировать?

  • В соответствии с диаграммой: Is op - указатель функции, указывающий на функцию sub()?

  • 7
    Большинство деталей, о которых вы спрашиваете, вы должны полностью игнорировать при программировании на Python. Python не определен с точки зрения памяти или указателей или подобных вещей низкого уровня. (Реализация должна беспокоиться об этом, но вам не нужно беспокоиться о реализации.)
  • 0
    @user2357112 user2357112 Для вашего утверждения «вы должны полностью игнорировать программирование на Python», нельзя избежать таких вопросов от людей, пришедших из языков ООП-парадигмы, таких как Java, или императивной парадигмы, такой как C. Как сказал Ноэль ниже, Python динамически и строго типизирован, поэтому имеет смысл понимать типовые вещи, применяемые к литералам и функциям (во время выполнения). После того, как я начал использовать python в течение 2-3 лет, и я не знаю, является ли op указателем на функцию или просто ссылочной переменной какого-то класса, я чувствую, что это неправильный подход в изучении языка.
Показать ещё 4 комментария
Теги:
object

3 ответа

1
Лучший ответ

Каждая программа C (скомпилированный язык) имеет сегменты кода/данных/стек/дополнительные/кучи, загруженные в память перед выполнением. Создает ли интерпретатор python любой макет памяти для каждой программы python перед началом интерпретации программы python? Если да, как мне визуализировать этот макет памяти?

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

Что касается программы Python, это только куча. Но сама компоновка похожа на любую другую программу.

Является ли const именем области памяти 32/64 бит, сохраняющей значение 2 с типом, назначенным как целое?

Это имя в текущем рабочем пространстве (здесь: в пространстве имен модулей), который по существу является dict, который выполняет назначения между строками и произвольными объектами. В этом случае строка const ссылается на целочисленный объект, который содержит значение 2. (Этот объект может быть создан заново или повторно использован в зависимости от обстоятельств, это не имеет никакого значения, поскольку оно является неизменным.)

add()/sub()/другие функции отображаются в столбце Objects в соответствии с диаграммой. Итак, как я воспринимаю функции, хранящиеся как объекты? Как это визуализировать?

Как написано в моих комментариях в ответ Игнасио:

В случае функций у вас есть объект, который имеет определенные поля, содержащие e. г. код в терминах байт-кода, количество параметров, которые у него есть, и т.д. И у него даже есть методы, например __get__(), который вызывается внутри для привязки метода к объекту или __call__() для вызова реальной функции, кроме __format__(), __repr__() и т.д.

Integer объект имеет, где-то глубоко внутри, место для хранения фактического значения. В случае long() в Py2 или любом int() в Py3 он сохраняет данные для хранения значения (например, 2), а также длины, необходимой для него. Кроме того, он имеет ряд методов. Посмотрите на вывод dir(2), чтобы увидеть, что он имеет множество методов, например, для форматирования, для арифметики и т.д..

В соответствии с диаграммой Is op указатель функции, указывающий на функцию sub()?

Вид, да.

Существует объект функции, который внутренне знает, что его исходное имя было sub. Но это знание предназначено только для показа.

В вашем случае это относится к двум именам, op и sub. Таким образом, обращение к любому из них имеет тот же результат.

Обратите внимание, что "указатели функций" как таковые отсутствуют, есть только ссылки или имена, которые относятся к объекту любого типа. Тип объекта фиксирован, но не "тип ссылки" (поскольку такой вещи нет).

  • 0
    glglgl Что касается вашей второй точки, я вижу точку, я думаю, что целочисленный литерал (2) автоматически упаковывается в целочисленный класс (во время выполнения), а const будет иметь тип целочисленного класса во время выполнения. В целом, любой литерал «abc», 3.2 будет автоматически помещен в соответствующий класс во время выполнения во время присваивания const = 2, поэтому const будет иметь тип целочисленного класса во время выполнения.
  • 0
    glglgl По поводу вашего третьего пункта, я не согласен с вами, я чувствую, что функция (скажем, sub () в вышеприведенном примере) также обернута внутри класса и затем указана ссылочной переменной (например, op в вышеприведенном примере), где op будет этого типа класса во время выполнения. для третьего пункта мы делаем это и в java 'interface Sample {int sub (int x, int y); } 'или' class Sample {int sub (int x, int y) {return xy;}} ', так что я думаю, что const - это ссылочная переменная типа целочисленного класса выше (во время выполнения), а op - ссылочная переменная (не функция указатель) типа класса, в который входит sub ().
Показать ещё 20 комментариев
3
  • В Python не беспокойтесь о сегментах памяти и о том, что происходит за кулисами. Скорее, среды (области) важнее. Диаграмма блоков и указателей, которую вы включили, является разумным способом визуализации памяти. Белая часть показывает, как выглядит глобальная среда. Когда функция вызывается, создается новая (синяя) среда.

  • const - переменная. Переменные в Python динамически типизируются слабо и могут хранить что угодно. Фактически, целые числа Python не переполняются и могут хранить числа, превышающие 2 64. В этом случае const - это переменная (с запутанным именем), которая содержит номер 2.

  • Функция представляет собой абстрактное понятие вызываемого blob кода. Вы можете назначить его переменной, как и любое другое значение.

  • Вы могли бы считать это указателем на функцию, если это заставляет вас чувствовать себя комфортно, но тогда вы будете выступать в качестве программиста на C. Программист Python просто сказал бы, что op имеет функцию sub как значение.

  • 0
    «Переменные в Python слабо типизированы» - я бы перефразировал это. Переменные не типизированы вообще, но значения типизированы (строго типизированы).
  • 2
    Python не является слабо типизированным, как Perl или C. Это динамически , но сильно типизировано.
Показать ещё 1 комментарий
3
  • Словари по словарям. Словари - это самая важная структура номер 1 в Python.

  • Это ключ записи в текущем словаре. Значение - это объект 2.

  • Это не те функции, которые являются объектами, но некоторые объекты являются функциями. Или номера. Или словари.

  • Это ключ записи в текущем словаре. Значение sub.

  • 0
    Игнасио, в чем смысл этих 2 утверждений: а) «Значение есть объект 2», б) некоторые объекты являются функциями. Или цифры. Или словари. '?? --- Как вы определяете слово "объект" здесь? Потому что в мире ООП объект имеет состояние и поведение.
  • 0
    Почему вы считаете, что объекты в Python не имеют состояния и поведения?
Показать ещё 19 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню