堆和栈的概念和区别 python_python有没有堆和栈的概念

本文探讨了Python中的赋值表达式概念,解释了Python如何创建对象并建立名称与对象之间的联系。作者指出,Python对象存在于操作系统管理的堆上,并非传统的树形结构堆。同时,Python虚拟机模拟了栈式机器,使用pyframeobject来实现栈操作。文章还提到了内存池和Python虚拟机的架构,适合对Python内存管理和虚拟机感兴趣的读者深入理解。
摘要由CSDN通过智能技术生成

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;

栈本身的概念非常简洁也非常有用处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值