为什么 __str__ 方法在链表中以递归方式打印节点?

Why is the __str__ method printing the nodes in an recursive way in a linked list?

只是想知道在 __str__ 方法中显示下一个节点的正确方法是什么。请参阅以下代码和结果。看起来有一些内置的递归性质为列表中的每个节点链接 __str__ 方法。谁能解释为什么以及如何让它正常运行,比如只打印下一个节点的地址。谢谢

class Node(object):
    def __init__(self, x):
        self.val = x
        self.next = None
    def __str__(self):
        return "Node {}, next is {}".format(self.val, self.next)

a = Node(1)
b = Node(2)
c = Node(3)
a.next = b
b.next = c
print(a)
Node 1, next is Node 2, next is Node 3, next is None

不要打印 self.nextstr 表示,而是尝试打印其 repr

    return "Node {}, next is {!r}".format(self.val, self.next)

结果:

Node 1, next is <__main__.Node object at 0x7f9f10066630>

打印所有节点的原因是 .format 在连接之前将每个输入转换为字符串。为此,它调用下一个节点的 __str__ 方法并继续循环。

有两个选项可以让它按照您想要的方式运行。在 __str__ 方法中,您可以调用 __repr__!r,或者您可以使用 id 手动获取内存位置并以任何您想要的方式对其进行格式化。

return "Node {}, next is {!r}".format(self.val, self.next)
# or
return "Node {}, next is <__main__.Node object at {}>".format(self.val, hex(id(self.next)))

这两个结果相同的输出:

Node 1, next is <__main__.Node object at 0x1005d7fd0>