在http://pythontutor.com/上运行时,我的查询是关于存储值和函数的符号的以下程序。
我的问题是:
在开始解释python程序之前,python执行模型如何在内存上查找上面的程序?我如何可视化内存布局?例如,c可执行文件有代码/堆栈/堆/额外/数据段,仅作为示例,我不比较
' const' 32/64位存储区的名称,存储值2,类型是否为整数?
add()/ sub()/其他函数按照图表显示在Objects列中,那么,我如何感知函数存储为对象?我如何想象它?
根据图表,op是一个指向函数sub()的函数指针吗?
答案 0 :(得分:3)
字典词典。字典是Python中最重要的结构。
它是当前范围词典中条目的关键。值为对象2
。
不是函数是对象,而是某些对象是函数。或数字。或词典。
它是当前范围词典中条目的关键。值为sub
。
答案 1 :(得分:3)
在Python中,不要过多担心内存片段以及幕后发生的事情。相反,环境(范围)更重要。您包含的块和指针图是可视化内存的合理方法。白色部分显示了全球环境的样子。调用该函数时,会创建一个新的(蓝色)环境。
const
是一个变量。 Python中的变量是弱动态类型,并且可以存储任何内容。事实上,Python integers don't overflow,可以存储超过2 64 的数字。在这种情况下,const
是一个变量(名称令人困惑),其中包含数字2
。
函数是可调用代码块的抽象概念。您可以像任何其他值一样将其分配给变量。
如果它让你觉得舒服,你可以认为它是一个函数指针,但那时你会成为一名C程序员。 Python程序员只会说op
将函数sub
作为值。
答案 2 :(得分:1)
每个C(编译语言)程序在执行之前都会在内存中加载代码/数据/堆栈/额外/堆段。在开始解释python程序之前,python解释器是否为每个python程序创建了任何内存布局?如果是,我如何可视化该内存布局?
它有一种布局,但这里堆是最重要的部分,因为每个对象都放在堆中。代码段只是解释器,数据段也是解释器的内部状态,也是堆栈。
与Python程序相关的只是堆。但布局本身就像任何其他程序一样。
const
是32/64位存储区的名称,存储值2
,类型是否为整数?
它是当前工作空间中的名称(在此处:在模块的命名空间中),它本质上是一个dict,它在字符串和任意对象之间进行赋值。在这种情况下,它使字符串const
引用包含值2
的整数对象。
(这个对象可以根据具体情况重新创建或重新使用;这没有区别,因为它是不可变的。)
add()
/sub()
/其他函数按照图表显示在对象列中,那么,我如何将函数存储为对象?我如何想象它?
在my comments中写到Ignacio的答案:
对于函数,您有一个具有某些字段的对象,其中包含e。 G。代码就字节码,它具有的参数数量等而言。它甚至还有方法本身,例如__get__()
在内部调用方法将方法绑定到对象,或__call__()
用于真实的函数调用,除了__format__()
,__repr__()
等。
整数对象在内部某处有一个用于存储实际值的位置。在Py2中的long()
或Py3中的任何int()
的情况下,它存储数据以保存值(例如2
)以及它所需的长度。此外,它有许多方法。看一下dir(2)
的输出,看看它有很多方法,例如格式化,for arithmetics等。
根据图表,
op
是一个指向函数sub()
的函数指针吗?
有点,是的。
有一个函数对象,它在内部知道它的原始名称是sub
。但这些知识仅用于显示目的。
在您的情况下,它会引用两个名称op
和sub
。所以参考其中任何一个都有相同的结果。
请注意,没有"功能指针"本身只有引用或名称,它们指的是任何类型的对象。对象的类型是固定的,但不是"类型的引用" (因为没有这样的事情)。