关于LinkedList类__repr__方法nodes列表构建及调用机制的疑问
LinkedList类__repr__方法与节点更新逻辑解析
一、__repr__方法的调用时机
- 直接在交互式Python环境中输入LinkedList实例并回车时,自动触发
- 调用内置函数
repr()传入LinkedList实例时,会执行该方法 - 使用
print()打印LinkedList实例时,若类未定义__str__方法,会自动调用__repr__(本次示例就属于这种情况) - 当LinkedList实例作为容器对象的元素被打印时,也会触发其
__repr__
二、关于nodes列表的疑问
你看到的nodes = []是__repr__方法内部的局部变量,它只在每次调用__repr__时临时创建,用来收集当前链表所有节点的字符串表示,生成完返回结果后就会被销毁,和链表的实际数据存储没有任何关系。
链表的真实数据是通过Node对象之间的nextval引用链来维护的,整个链表的入口是LinkedList实例的self.head属性——它指向链表的第一个节点,后续节点通过每个节点的nextval依次相连,完全不需要依赖这个临时的nodes列表。
三、prepend和append方法的链表更新逻辑
prepend(头部插入)
每次调用prepend时:
- 创建一个新的
Node对象,传入要添加的数据,并将新节点的nextval设置为当前链表的self.head(原链表的第一个节点) - 将
self.head重新赋值为这个新节点,新节点成为链表的新头部,原链表的所有节点挂在它后面
append(尾部插入)
每次调用append时:
- 如果链表是空的(
self.head为None),直接把self.head设为新创建的Node对象 - 如果链表非空,从
self.head开始遍历,找到最后一个节点(即nextval为None的节点) - 把最后一个节点的
nextval设置为新创建的Node对象,新节点被加到链表末尾
示例演示
# 创建链表实例 ll = LinkedList() # 尾部添加元素1 ll.append(1) # 头部添加元素0 ll.prepend(0) # 打印链表,触发__repr__ print(ll) # 输出:[0->1]
执行print(ll)时,__repr__从头节点(存储0的Node)开始遍历,依次把每个节点的字符串表示加入临时的nodes列表,最后拼接成格式化字符串返回。
内容的提问来源于stack exchange,提问作者Jeff Johnson
相关产品推荐
相关产品推荐

