V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
tinydebian
V2EX  ›  Python

Python 有 C 程序中的堆或堆栈的概念吗?

  •  
  •   tinydebian · 2019-07-23 20:44:40 +08:00 · 3271 次点击
    这是一个创建于 1950 天前的主题,其中的信息可能已经有所发展或是发生改变。
    CPython 是由 C 语言开发的。请问几个关于 Python 内存的问题。

    1 ) Python 有 C 程序中的堆或堆栈的概念吗?

    2 )将参数传给函数,调用函数的时候,参数是像 C 语言一样,压入堆栈吗?

    3 )如果有堆和堆栈的概念,Python 的垃圾回收,对于堆和堆栈,是一样的吗?

    谢谢。
    5 条回复    2019-07-24 17:24:32 +08:00
    lihongjie0209
        1
    lihongjie0209  
       2019-07-23 20:49:19 +08:00
    堆栈是操作系统中进程的概念, 和语言实现无关
    misaka19000
        2
    misaka19000  
       2019-07-23 20:51:41 +08:00
    Python 虚拟机是使用 stack 来做函数调用的,至于有没有 堆 就不清楚了
    lynskylate
        4
    lynskylate  
       2019-07-23 23:51:57 +08:00 via Android
    python 虚拟机是栈式虚拟机,但这里的栈只是单纯是数据结构而已,和 c 中的堆栈不一样。

    python 也会压参数进虚拟机的栈。具体自己使用 dis 模块看一下

    因为没有类似 c 的堆栈概念,所以第三个问题不成立
    sujin190
        5
    sujin190  
       2019-07-24 17:24:32 +08:00
    @misaka19000 #2
    @lynskylate #4

    其实 c 是栈分配局部变量,函数执行结束,变量就消失了,要函数结束变量还在,那么只能通过 malloc 在堆上分配变量

    python 函数执行过程是类似的,每个函数执行分配一个栈帧,当前栈帧关联这上一个函数的栈帧,整个调用链就出来了,而 python 所有的变量分配使用的都是堆内存,函数运行是通过名称加载把名称引用的变量加载到栈帧里,之后就可以执行指令完成计算了,指令计算的结果也返回在栈帧里,再通过名称加载把变量关联到名称上

    某种意义上来看这也是 python 性能不高的问题之一吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   932 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:19 · PVG 05:19 · LAX 13:19 · JFK 16:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.