Python自定义linked_list for遍历报不可迭代TypeError问题
报错原因
Python中for循环只能遍历可迭代对象,你的自定义linked_list类没有实现Python可迭代协议要求的对应方法,解释器无法按顺序获取链表中的元素,因此抛出类型错误。
要让自定义类支持for循环遍历,只需要满足可迭代协议的任意一条规则即可:
- 实现
__iter__()方法,返回一个带__next__()方法的迭代器对象,遍历完成时抛出StopIteration异常 - 实现
__getitem__()方法,支持从0开始的整数索引取值,索引超出范围时抛出IndexError
修复方法
针对链表的链式结构,最高效、代码最简洁的实现方式是在linked_list类中添加__iter__()方法,用生成器实现迭代逻辑,不需要额外编写迭代器类:
def __iter__(self): # 跳过初始化时创建的空哨兵头节点,从第一个存储有效数据的节点开始遍历 current_node = self.head.next while current_node is not None: yield current_node.data current_node = current_node.next
添加该方法后,不仅可以直接用for循环遍历链表实例,所有支持可迭代对象的内置操作(比如转列表、元组、求和等)都可以正常使用:
# 测试代码 my_list = linked_list() my_list.append("a") my_list.append("b") my_list.append("c") # for循环遍历 for val in my_list: print(val) # 直接转列表 print(list(my_list)) # 输出 ['a', 'b', 'c']
补充说明:如果选择实现
__getitem__()方法也能达到支持遍历的效果,但链表不支持随机访问,每次按索引取值都需要从头节点开始遍历,整体遍历性能远低于上述生成器实现的__iter__方案,不推荐使用。
内容的提问来源于stack exchange,提问作者ex7rema
相关产品推荐
相关产品推荐

