擅长:python、mysql、java
<p>这是一个有趣的问题,我试着试一试。我的主要编程语言是Java,但我认为CPython&JVM在本例中是相同的。在</p>
<p>在程序运行时,它得到堆栈和堆,堆栈用于方法调用上下文存储,堆用于全局对象存储。在</p>
<p>好的,那么,以您的代码为例</p>
<p>第1步。在</p>
<pre><code>my_dict = {'a': 1}
</code></pre>
<p>它将在<strong>堆</strong>中创建dict(1)<strong>{'a':1}</strong>,然后我的dict被<strong>引用到dict(1)的内存地址,这意味着我的dict现在指向的是一个<strong>内存地址</strong>,而不是{'a':1}本身。在</p>
<p>第二步。在</p>
^{pr2}$
<p>好的,那么我们在main函数内部调用modify_dict function,程序会把main函数的上下文放入一个堆栈(stack1),而go into函数<strong>modify_dict</strong>作为参数,现在,程序将为modify_dict函数创建一个新的堆栈,<strong>复制一个参数</strong>,这意味着我的“u dict”参数现在是一个<strong>引用副本</strong>(指向堆中的dict(1),其值与main中的myu dict变量相同,<strong>,但它是一个副本</strong>)。(事实上,问题已经在这里得到了回答)</p>
<p>第三步:</p>
<pre><code>my_dict = {'b': 2}
</code></pre>
<p><strong>我的字典</strong>(堆中<strong>dict(1)</strong>的参考点)现在被分配给堆中的一个新dict(2),记住<strong>我的字典现在和我的主字典不一样,<strong>它们指向堆中的两个不同的dict</strong>。在</p>
<p>第四步:</p>
<p>程序返回到主函数,程序将从堆栈中拉出内容,<strong>我的字典现在指向dict(1)</strong>,dict(1)在modify-dict函数中不是modify</p>
<p>对不起,我的英语很差:)</p>