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

时间:2017-03-28 20:39:48

标签: python linked-list singly-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

2 个答案:

答案 0 :(得分:1)

而不是打印self.next str代表,请尝试打印repr代替:

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

结果:

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

答案 1 :(得分:0)

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

有两种方法可以让它按照您想要的方式行事。在__repr__方法中,您可以调用!rreturn "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))) ,也可以使用ID手动获取内存位置,并以您想要的任何方式对其进行格式化。

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

这两个导致相同的输出:

var postProcess = new BABYLON.FxaaPostProcess("fxaa", 1.0, null, null, engine, true);