L,
1级
2015-11-28 回答
作者:jasonleaster
链接:https://www.zhihu.com/question/34835069/answer/87490319
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
声明:以下提及的python实现或相关细节概念均特指cpython
1. 首先解决题主demo代码里面的疑惑
(没写过compiler)不管是python还是c, 很重要的一个概念就是name 和 object。在python里面赋值语句有非常简洁的抽象概念,如下
assignment expression in python have two things in common:
create a new object
build a connection between that new object and a name
题主可以思考既然 a = 1 在python中是assignment expression,那么def func(): pass 是不是一个赋值语句呢?(请紧扣上面关于赋值表达式的两条概念) 我并没有说题外话,只是在帮助题主更深刻的理解demo代码里面关于赋值过来赋值过去的一些疑惑。
一方面为了更好的利用高效率的内存,另一方面为了释放把程序员从各种内存管理的细节中解放,更好的关注“业务逻辑”,有了gc和一些很爽的技术,比方说reference
in [8]: string_1 = "eof"
in [9]: string_2 = "eof"
in [11]: print "address 1: %x" % id(string_1)
address 1: 7f2517898530
in [12]: print "address 2: %x" % id(string_2)
address 2: 7f2517898530
2. 关于题主说的python中是否存在stack。
严谨的说,stack只是一种抽象数据结构。不管是什么语言,实现一个stack应该不难。
题主的意思应该是指python语言本身是否存在stack or heap 概念的实现。
关于heap的定义:
in computer science, a heap is a specialized tree-based data structure that satisfies the heap property: if a is a parent node of b then the key of node a is ordered with respect to the key of node b with the same ordering applying across the heap. -- wikipedia
关于heap,可能才疏学浅又或者眼神不好使,并没有找到符合树形结构定义的heap,相反,python对象都是生存在机器操作系统管理的原生heap上的,这里的这个heap就是特身的机器本身动态内存,是由c语言的内存管理api malloc那一堆family api申请来的。所以才会常常听到人们说“python的对象都是生存在堆上的”。 如果题主有兴趣还有探究python虚拟机的实现,会发现这货完全在模拟x86 stack-based machine。如果对c语言很了解那就更不用说了,简直就是个仿真。
多说一句,有兴趣的话可以探究一下,python的内存池(pool)是怎么回事。
我做的一点点积累,有兴趣可以瞥一眼 architecture of python virtual machine
(友情提示,不感兴趣不要点开 : )
再说关于stack。 额。。前面都说了python的虚拟机就是stack-based machine,所以python语言本身实现了stack,具体的就是 pyframeobject里面的两个指针以及一些宏操作。
我没有说pyframeobject本身就是stack,因为pyframeobject本身是为了隔离namespace而存在的。
而每一个pyframeobject都有定义两个指针 -- pyobject **f_valuestack, pyobject ** f_stacktop
这两个指针模拟了x86平台里面的esp 和 ebp寄存器的作用。。至于pop或者push之类对于栈的操作都是用宏实现的,也都是对这两个指针操作。
typedef struct _frame {
pyobject_var_head
... ...
pyobject **f_valuestack;/* points after the last local */
/* next free slot in f_valuestack.
frame creation sets to f_valuestack.
frame evaluation usually nulls it, but a frame that yields sets it
to the current stack top. */
pyobject **f_stacktop;
... ...
} pyframeobject;
栈本身的概念非常简洁也非常有用处。