<p>在Python中的大多数情况下,当您对变量执行赋值时,<code>P</code>在本例中,<code>P</code>的值会更改,但它最初引用的对象不会更改。这是因为Python变量只是对对象的引用/指针。举个例子:</p>
<pre><code>var1 = "test1"
var2 = "test2"
var3 = var1 # var3 = "test1"
var1 = var2 # var1 = "test2"
print(var1) # "test2"
print(var2) # "test2"
print(var3) # "test1"
</code></pre>
<p>那么这里发生了什么?我们只是在改变这些变量所指向的东西,而不是改变底层对象。你知道吗</p>
<p>现在,在您的情况下,您可以执行以下操作:</p>
<pre><code># changing value of pointer does not affect L
P = L
P = P.next
L.iterateLL() # L is unchanged
</code></pre>
<p>当您执行<code>P = L</code>和<code>P = P.next</code>时,您只需更改变量<code>P</code>所指向的内容。您没有对<code>P</code>指向的基础对象进行更改。让我们想象一下。你知道吗</p>
<p>原始配置:
<a href="https://i.stack.imgur.com/NcZfF.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/NcZfF.png" alt="Original Configuration"/></a></p>
<pre><code>P = L
</code></pre>
<p><a href="https://i.stack.imgur.com/oPc1P.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/oPc1P.png" alt="P = L"/></a></p>
<pre><code>P = L.next
</code></pre>
<p><a href="https://i.stack.imgur.com/H8FNV.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/H8FNV.png" alt="P = L.next"/></a></p>
<p>但是,当你这么做的时候</p>
<pre><code>P = L
P.next = P.next.next
L.iterateLL() # we've now skipped node two
</code></pre>
<p>您正在更改<code>P</code>所指向的对象的属性。您正在将属性<code>P.next</code>设置为指向<code>P.next.next</code>。实际上,您并没有对<code>P.next</code>最初指向的基础对象进行更改。通过这样做,<code>P.next</code>最初指向的对象将超出范围,并由垃圾收集器清理。你知道吗</p>
<pre><code>P.next = P.next.next
</code></pre>
<p><a href="https://i.stack.imgur.com/PcUnZ.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/PcUnZ.png" alt="P.next = P.next.next"/></a></p>
<p>根据您的代码判断,我假设您在本例中的预期行为是从LinkedList中删除<code>L</code>,最后得到一个类似“2 3 4”的列表。要做到这一点,做<code>L = L.next</code>就足够了。这将导致第一个节点超出作用域,垃圾收集器应该清理它。你知道吗</p>
<p>作为一个简短的警告,我提到在大多数情况下,赋值不会更改变量所指向的对象。但是,属性有点不同。它们重写<code>__set__</code>魔术方法,该方法允许您使用赋值操作符编辑基础对象。这里不是这样。你知道吗</p>