Home >Backend Development >Python Tutorial >python有没有堆和栈的概念?

python有没有堆和栈的概念?

WBOY
WBOYOriginal
2016-06-06 16:24:132890browse

<span class="n">a</span> <span class="o">=</span> <span class="s">"abc"</span>
<span class="n">b</span> <span class="o">=</span> <span class="n">a</span>
<span class="n">a</span> <span class="o">=</span> <span class="s">"XYZ"</span>
<span class="k">print</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>

回复内容:

JVM和CLR的那种stack和heap的区分应该是没有的,按这个算python应该只有heap,但是有常量池。陈儒老师和赖勇浩老师的《Python源码剖析》有详细的介绍这方面的知识。
================
多年不读源码剖析,我的说法是有问题的,评论里 RednaxelaFX 有修正:“CPython不但有栈有堆而且栈还有native stack和PyFrameObject构成的解释器栈两边”。 声明:以下提及的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

<code class="language-python3"><span class="n">In</span> <span class="p">[</span><span class="mi">8</span><span class="p">]:</span> <span class="n">string_1</span> <span class="o">=</span> <span class="s">"EOF"</span>
<span class="n">In</span> <span class="p">[</span><span class="mi">9</span><span class="p">]:</span> <span class="n">string_2</span> <span class="o">=</span> <span class="s">"EOF"</span>
<span class="n">In</span> <span class="p">[</span><span class="mi">11</span><span class="p">]:</span> <span class="nb">print</span> <span class="s">"address 1: %x"</span> <span class="o">%</span> <span class="nb">id</span><span class="p">(</span><span class="n">string_1</span><span class="p">)</span>
<span class="n">address</span> <span class="mi">1</span><span class="p">:</span> <span class="mi">7</span><span class="n">f2517898530</span>
<span class="n">In</span> <span class="p">[</span><span class="mi">12</span><span class="p">]:</span> <span class="nb">print</span> <span class="s">"address 2: %x"</span> <span class="o">%</span> <span class="nb">id</span><span class="p">(</span><span class="n">string_2</span><span class="p">)</span>
<span class="n">address</span> <span class="mi">2</span><span class="p">:</span> <span class="mi">7</span><span class="n">f2517898530</span>
</code>
请不要使用Java那一套思想来理解python。 编译器不懂。不发表评论。
但是字符串在python里面是常量,实现大概是一个常量池之类的东西。
str的值不能被改变,能改变的只是变量标记指向的地址。
<code class="language-text">a = "str"
b = "str"

a is b
</code>
记住一点:CPython为例,所有变量都是一个PyObject*,也就是指针,而所有赋值语句都是将一个对象的地址赋值给它,其实不光是变量,容器里面的也是,比如list和dict的元素等,所以你这里的代码就相当于:
PyObject *a = new_str("abc");
PyObject *b = a;
a = new_str("xyz");
当然内部不是用new_str这个函数,具体名字我忘啦

python引用的问题我曾经在一个群做过分享,有人整理了聊天记录:
python对象的引用-python2群20130223群内授课记录
可以看看,欢迎讨论 看到这个问题,如鲠在喉,想说什么,又不知道说什么。。。。
1。a 和 b 是两个不同的变量, a = b 是变量赋值啊,不是引用赋值。当然打印结果是不一样的。这是python语法的问题。
2。堆和栈, 当堆和栈两个放在一起说的时候,当然指的是C语言中那个特殊的堆和特殊的栈,而不是数据结构中的那个栈。所以有些答案不对题。
3。python语言和python虚拟机的问题, python虚拟机只是python语言的一个实现,如果说这个虚拟机用C写,那当然是有堆和栈,问题是,有手册定义了具体实现的方法吗?
4。如果说python语言本身, 问题,你看到哪本python的书里讲到堆和栈,我的意思是,刨去语言实现部分。
所以,这个问题么。。。少年,请搞清基本概念再来讨论吧。 a 和b应该只是一个标签
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn