非类型错误:Python双链接列表
陷入了使用my functions产生的非类型错误的解决方案中,在下面的代码中将添加并附加到空的Double_list类对象。最好的避免方法非类型错误:Python双链接列表,python,linked-list,nonetype,Python,Linked List,Nonetype,陷入了使用my functions产生的非类型错误的解决方案中,在下面的代码中将添加并附加到空的Double_list类对象。最好的避免方法 class Dbl_Node: def __init__(self, data): self.data = data self.next = None self.prev = None class Double_list: def __init__(self): # Creates in
class Dbl_Node:
def __init__(self, data):
self.data = data
self.next = None
self.prev = None
class Double_list:
def __init__(self): # Creates initial list w/ head and tail as None
self.head = None
self.tail = None
def add(self, item): # adds node to beginning/head of list
temp = self.head
self.head = Dbl_Node(item)
temp.prev = self.head
self.head.next = temp
def append(self, item): # adds node to end/tail of list
temp = self.tail
self.tail = Dbl_Node(item)
self.tail.prev = temp
temp.next = self.tail
您正在将
head
和tail
初始化为None
,但在插入第一个Dbl_节点时,尝试在其上设置prev
和next
成员
def add(self, item):
temp = self.head # on the first call to "add", self.head is None
# (as set in __init__) so temp is now None
self.head = Dbl_Node(item) # create a new node and assign it to self.head
# this is fine
temp.prev = self.head # this says assign the new node in self.head to the "prev"
# member of temp, however temp is None so the temp.prev part
# throws the error
你应该检查一下这个箱子
def add(self, item): # adds node to beginning/head of list
temp = self.head
self.head = Dbl_Node(item)
if temp is not None:
temp.prev = self.head
另一种解决方案是从头部和尾部的“虚拟”节点开始:
def __init__(self):
self.head = Dbl_Node(None)
self.tail = Dbl_Node(None)
self.head.next = self.tail
self.tail.prev = self.head
然后在这些节点之间插入项目
def add(self, item):
temp = self.head.next
self.head.next = Dbl_Node(item)
temp.prev = self.head.next
self.head.next.next = temp
虽然我发现这会让事情变得有点复杂
def append(self, item): # adds node to end/tail of list
temp = self.tail
self.tail = Dbl_Node(item)
self.tail.prev = temp
temp.next = self.tail
这将始终引发NoneType
异常,因为
self.tail
最初为None
,然后分配一个引用
将它(None
)添加到temp
,并尝试为其分配一些内容
无
。不行
您可能需要首先为self.tail
分配一个新的对象引用,如果您将错误消息添加到问题中,您会得到更好的答案。对不起,当然,这里是:“在add temp.prev=self.head builtins.AttributeError中:'NoneType'对象没有属性“prev”
它指的是带有temp.prev=self.head的行感谢您的快速更新。您可以通过单击问题标签下的edit
按钮来编辑问题以添加其他信息。这是向问题添加信息的首选方法,因为在评论线程中有时会丢失一些信息。我的想法是,它会从“无”变为self.head中的任何内容。有什么好的理由不只是将temp.prev
重新分配给新变量而不是错误?不是temp.prev
是None
,而是temp
本身。当您尝试分配给temp.prev
时,Python会在temp
对象中查找名为prev
的成员,即None
,因此出现异常。我将用注释对上面的代码进行注释,以便更好地说明。哦,没错,因为temp并不是指整个节点实例,而是指self.head。我想我把temp作为一个完整的节点。谢谢你的解释!