<p>这里发生了一些事情。在</p>
<p>首先,正如您所说,您的<code>__str__</code>缩进是错误的。但它仍然是一个<em>有效的</em>缩进,这就是为什么您不能得到<code>IndentationError</code>。只有在调用<code>__str__</code>时才会出现错误,只有当它处于正确的缩进级别时才会发生,这是较小的缩进,与<code>__init__</code>和{<cd5>}一致。(否则,它只是<code>addNeighbor</code>中的一个局部函数,而且非常无用。)</p>
<p>一旦调用了<code>__str__</code>方法,您得到的错误是由于<code>self.connectedTo</code>字典的结构造成的。在<code>addNeighbor()</code>中,您正在映射<code>neighbor: weight</code>,其中<code>neighbor</code>作为<code>str</code>传入,而权重作为<code>int</code>传入。当您在<code>[x.id for x in self.connectedTo]</code>中迭代字典时,Python将迭代该字典的<em>键</em>,在本例中是<code>neighbor</code>,一个字符串。所以<code>x</code>变成了一个字符串。(列表理解最好写为<code>[x.id for x in self.connectedTo.keys()]</code>,这与原来的相同,但更清晰。)</p>
<p>您链接的页面显示了最初的错误,即<code>neighbor</code>应该是另一个<code>Vertex</code>,而不是<code>str</code>。这意味着这一切都归结为向<code>addNeighbor()</code>传递了错误类型的参数。考虑到这一点,我可能会像这样重写你的测试代码。。。在</p>
<pre><code>class Vertex:
def __init__(self, key):
self.id = key
self.connectedTo = {}
def addNeighbor(self, neighbor, weight=0):
self.connectedTo[neighbor] = weight
def __str__(self):
return str(self.id) + ' connectedTo: ' + str([x.id for x in self.connectedTo])
if __name__ == '__main__':
vertex = Vertex(1)
vertex.addNeighbor(Vertex(1), 20) # This creates a second Vertex with the same ID
# as `vertex` probably not what you intend?
vertex.addNeighbor(Vertex(2), 10)
print(vertex)
# Output:
1 connected to: [1, 2]
</code></pre>