我正在构建一个简单的链表,我可以按相反的顺序打印它(添加的第一个节点最后打印),但我想按正常顺序打印它。但是我不确定为什么我总是收到无法打印 None 的错误。
class Node:
def __init__(self, data):
self.data = data
self.next = None
def addNextData(self, data):
self.next = Node(data)
return self.next
def __str__(self):
if(self is None):
return "None"
print(self.data)
return print(self.next)
node = Node("a")
node.addNextData("b") \
.addNextData("c") \
.addNextData("d")
print(node)
Traceback (most recent call last):
TypeError: __str__ returned non-string (type NoneType)
我已经采取了这样的做法,但它打印了不必要的空白字符串/行:
def __str__(self):
if(self is None):
return "None"
print(self.data)
print(self.next)
return ""
我能够迭代地执行此操作,但也许有一种更优雅的方法可以通过打印/递归来执行此操作:
def __str__(self):
head = self
str = ''
while(head is not None):
str = str + head.data + '->'
head = head.next
return str + 'None'
我很难理解为什么这个(逆序打印)不会抛出 None 错误。 :
def __str__(self):
print(self.next)
return self.dat
也很困惑,因为 print(None) 不会抛出错误。
您不想从
__str__
方法打印任何内容 - 它应该只返回 str
。 print
是一个打印字符串但不返回任何内容的函数,因此 return print(...)
相当于 print(None)
。这就是您的 TypeError: __str__ returned non-string (type NoneType)
错误的原因。
if(self is None):
return "None"
也是一个无操作,因为
self
永远不会*成为 None
,因为它(根据定义)是您的 Node
类型的实例。
在你的情况下,你可以做类似的事情
class Node:
def __init__(self, data):
self.data = data
self.next = None
def addNextData(self, data):
self.next = Node(data)
return self.next
def __str__(self):
if self.next is not None:
return str(self.data) + ", " + str(self.next)
else:
return str(self.data)
node = Node("a")
node.addNextData("b") \
.addNextData("c") \
.addNextData("d")
print(node)
* 永远不要,除非你故意用
None
直接调用它,例如(Node.__str__(None)
)