Python学习__init__使用及链表add方法报'list'无first属性问题
问题原因分析
- 语法错误:
Pair类的构造方法名拼写错误,你写的__int__是整数类型转换魔术方法,不是实例初始化的__init__,会直接导致创建Pair实例时报错。 - 类型不匹配错误:你自定义的
LinkedList类型是Pair节点组成的链式结构,不是Python原生的list类型。测试时直接传入原生列表[1,2,3],add函数执行时尝试访问lst.first,原生列表没有first属性,直接触发你遇到的报错。 - 输出逻辑缺失:
Pair类没有自定义字符串序列化方法,就算逻辑正确,直接打印Pair实例只会输出内存地址,无法验证结果正确性。
修复方案
- 修正
Pair类的构造方法名,统一类型标注写法 - 新增辅助函数实现原生
list到自定义LinkedList的转换 - 给
Pair类添加__repr__方法,实现可读的打印效果 - 修改测试代码,先转换列表格式再调用
add函数
完整修正代码
from __future__ import annotations from typing import Any, Optional class Pair: # 修正构造方法名,把__int__改成__init__,类型标注any改成大写Any def __init__(self, first: Any, rest: Optional[Pair]) -> None: self.first = first self.rest = rest # 新增序列化方法,方便打印 def __repr__(self) -> str: return f"{self.first} -> {self.rest}" LinkedList = Optional[Pair] def add(lst: LinkedList, index: int, value: Any) -> LinkedList: if index == 0: return Pair(value, lst) if lst is None: raise IndexError return Pair(lst.first, add(lst.rest, index - 1, value)) # 新增辅助函数:把原生list转成自定义LinkedList def list_to_linked(native_list: list[Any]) -> LinkedList: linked = None # 倒序遍历构造链表,保证顺序和原生列表一致 for item in reversed(native_list): linked = Pair(item, linked) return linked
修正后的测试代码
# 先把原生列表转成自定义链表 my_linked_list = list_to_linked([1,2,3]) # 调用add方法后打印 print(add(my_linked_list, 1, "hi"))
运行后输出为:1 -> hi -> 2 -> 3 -> None,符合在索引1位置插入"hi"的预期。
内容的提问来源于stack exchange,提问作者Bob Johnson
相关产品推荐
相关产品推荐

