<p>好吧,让我试着用一些图片来解释。在</p>
<p>在Python中,一切都是一个对象。这些对象被变量引用。有些类型的对象,如列表和元组,只存储对其他对象的引用。在</p>
<p>也就是说,当你执行死刑时</p>
<pre><code>myVar = ["jhhj", "hgc"]
myTuple = ([1,2,3], [4,5,6], myVar)
</code></pre>
<p>您或多或少会遇到这种情况:</p>
<p><img src="https://i.imgur.com/X5ZpQ.png" alt="A tuple pointing to three lists; a list pointing to two strings"/></p>
<p>每个对象都由一个框/矩形表示。我们有两个字符串对象,<code>"jhhj"</code>和<code>"hgc"</code>。另外,我们还有一个list对象,由变量<code>myVar</code>指向;这个list对象指向两个string对象。另外,我们还有一个tuple对象,由<code>myTuple</code>引用;这个tuple对象指向另外两个列表和{<cd3>}引用的列表。在</p>
<p>当你执行</p>
^{pr2}$
<p>发生了什么?好吧,列表对象(顺便由<code>myVar</code>指向)开始引用另一个值,字符串对象<code>"lololol"</code>:</p>
<p><img src="https://i.imgur.com/5KrCJ.png" alt="A tuple pointing to three lists; a list pointing to two strings; a new string is added to the list"/></p>
<p>注意,<code>myVar</code>仍然引用list对象。结果列表对象<em>改变了</em>。您可以从<code>myVar</code>或元组中查看此列表对象,您将看到具有相同更改的同一对象。在</p>
<p>奥托,当你执行死刑的时候</p>
<pre><code>myVar = "lol"
myTuple = ([1,2,3], [4,5,6], myVar)
</code></pre>
<p>你会得到这样的结果:</p>
<p><img src="https://i.imgur.com/oCJij.png" alt="A tuple pointing to two lists and a string, also pointed by a variable"/></p>
<p>现在,<code>myVar</code>指向字符串对象<code>"lol"</code>,元组在第三个位置引用它。现在,如果你执行</p>
<pre><code>myVar = "lolol"
</code></pre>
<p>您只是使<code>myVar</code>指向另一个对象。tuple对象仍然像以前一样指向<code>"lol"</code>:</p>
<p><img src="https://i.imgur.com/HcbyJ.png" alt="A tuple pointing to two lists and a string, also pointed by a variable. The variable now references another string."/></p>
<p>所以,如果你把一个新值赋给一个变量,它只会改变这个变量所指向的值。变量引用的前一个值仍将存在*并且指向它的任何其他变量或对象将保持指向该值。只是属性变量会改变。在</p>
<p>另外,<a href="https://stackoverflow.com/questions/10748158/why-does-the-operator-not-change-a-list-while-append-does/10748191#10748191">I answered a vaguely related question some time ago</a>。你可能会发现答案很有帮助。在</p>
<p>*除非它是由垃圾回收器收集的,但这是另一个漫长的历史。在</p>