为什么 __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.next
的 str
表示,而是尝试打印其 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>
只是想知道在 __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.next
的 str
表示,而是尝试打印其 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>