<p>之所以发生这种情况,是因为您所理解的识别<code>Node</code>类的两个实例的特性,并不是python所理解的。</p>
<p>问题就在这里。假设您问python<code>5==5</code>,python将返回<code>True</code>。这是因为python知道<code>int</code>s。但是,<code>Node</code>是您定义的自定义类,因此当两个<code>Node</code>对象相同时,您需要告诉python。因为您(可能)没有,所以python默认比较它们在内存中的位置。由于两个独立的实例将位于两个不同的内存位置,python将返回<code>False</code>。如果您完全熟悉Java,这就像<code>==</code>和<code>.equals(...)</code>之间的区别</p>
<p>为此,进入<code>Node</code>类并定义<code>__eq__(self, other)</code>方法,其中<code>other</code>应该是<code>Node</code>的另一个实例。</p>
<p>例如,如果您的节点有一个名为<code>name</code>的属性,并且两个同名的节点被认为是相同的,那么您的<code>__eq__</code>可能如下所示:</p>
<pre><code>def __eq__(self, other):
myName = self.name
hisName = other.name
if myName == hisName:
return True
else:
return False
</code></pre>
<p>当然,编写相同功能的更优雅的方法是:</p>
<pre><code>def __eq__(self, other):
return self.name == other.name
</code></pre>
<p>完成后,您的错误将消失</p>
<p><strong>编辑1</strong>:响应<a href="https://stackoverflow.com/users/487339/dsm">DSM</a>的注释</p>
<pre><code>class Node: pass
a = [Node(), Node()]
b = a[:]
b.remove(a.pop(0))
</code></pre>
<p>这会奏效的。但仔细观察,很明显a[0]和b[0]实际上是同一个物体。这可以通过调用<code>id(a[0])</code>并将其与<code>id(b[[0])</code>进行比较来验证,以确认它们确实是相同的</p>
<p><strong>编辑2</strong>:针对OP的后续问题(作为编辑添加到原始问题中)</p>
<p>是的,列表中不存在的对象将导致错误,该错误通常会停止程序流。这可以通过以下两种方法之一解决:</p>
<pre><code>if x in my_list:
my_list.remove(x)
</code></pre>
<p>或者</p>
<pre><code>try:
my_list.remove(x)
except:
pass
</code></pre>
<p>第二个方法试图从<code>my_list</code>中删除<code>x</code>,如果这导致错误,则忽略错误</p>