Python实现LinkedList触发缺少必填位置参数TypeError报错
报错根因
触发TypeError: missing 1 required positional argument的核心错误是实例化Node类的写法不符合Python语法规则:
- Python创建类实例的标准写法为
类名(初始化参数),该写法会自动完成新实例的内存分配,并将新实例作为self参数传入类的__init__方法完成初始化。 - 你写的
Node.__init__(element)是直接调用未绑定的构造方法,既没有生成新的Node实例,也没有传入__init__方法要求的第一个self参数,因此会抛出参数缺失的报错。
除了这个直接触发报错的问题,你的代码还有3处会导致后续运行异常的设计问题:
- Node类中将
element、nextNode定义为类属性,所有Node实例会共享这两个值,违背链表每个节点独立存储数据、后继指针的设计逻辑 - LinkedList类中将
head定义为类属性,所有LinkedList实例会共享同一个头节点,应该改为实例属性 prettyPrint方法存在三个逻辑漏洞:未处理空链表的边界情况、循环终止条件会漏掉最后一个节点的输出、直接将int类型的节点值与字符串用+拼接会触发类型错误
修正后可运行代码
class Node: def __init__(self, element: int): # 实例属性,每个节点独立持有 self.element = element self.nextNode = None class LinkedList: def __init__(self): # 头节点改为链表实例的属性,不同链表实例互不干扰 self.head: Node = None def insert(self, element: int): if self.head is None: # 正确实例化Node的写法 currentNode = Node(element) self.head = currentNode else: currentNode = self.head while currentNode.nextNode is not None: currentNode = currentNode.nextNode newNode = Node(element) currentNode.nextNode = newNode def prettyPrint(self): currentNode = self.head print("Current Linked List\n") # 处理空链表边界 if currentNode is None: print("Empty linked list") return # 遍历所有节点,包含最后一个 while currentNode is not None: print(f"{currentNode.element} ---> ", end="") currentNode = currentNode.nextNode print("None") def main(): linked_list = LinkedList() linked_list.insert(1) linked_list.insert(9) linked_list.insert(2) linked_list.insert(18) linked_list.insert(5) linked_list.insert(8) linked_list.prettyPrint() if __name__ == '__main__': main()
运行上述代码的输出结果为:
Current Linked List 1 ---> 9 ---> 2 ---> 18 ---> 5 ---> 8 ---> None
内容的提问来源于stack exchange,提问作者Liferafter
相关产品推荐
相关产品推荐

