Python链表打印输出内存地址需双重调用val属性问题求解
问题根因
你的链表出现双层val调用的核心原因是节点被重复封装了:LinkedList类的append方法设计逻辑是接收原始存储值,内部自动创建LinkedNode节点完成挂载。但你在外部调用append时,没有传入2、3、4这类原始值,而是手动提前创建了LinkedNode对象传入,最终导致节点嵌套:
- 第一层是
append方法内部新建的LinkedNode实例,它的val属性存的是你传入的手动创建的LinkedNode对象 - 第二层是你手动创建的
LinkedNode实例,它的val属性才是真正要存储的数值
直接打印curr.val拿到的是第一层节点里存的内层节点对象,默认输出就是对象内存地址,必须再取一层.val才能拿到真实数据。
解决方案
两种方案二选一即可,不要混合使用:
- 方案1(推荐,符合链表常规封装设计):保留
append现有逻辑,修改外部调用方式,直接传入原始存储值,不需要手动创建节点
把测试部分的代码修改为:
改完后l1 = LinkedList() l1.append(2) l1.append(3) l1.append(4) l1.print()print方法里的print(curr.val)就可以直接输出正确数值,调用方不需要关心内部节点的实现细节,封装性更好。 - 方案2(适合需要自定义节点特殊属性的场景):保留外部传
LinkedNode的调用方式,修改append内部逻辑,去掉重复的节点创建步骤
把append方法改写为:
这种写法下def append(self, new_node): if self.head: curr = self.head while curr.nxt: curr = curr.nxt curr.nxt = new_node else: self.head = new_nodeappend直接接收已经创建好的节点挂载,不会产生嵌套,print(curr.val)也能正常拿到数值,但每次追加元素都需要手动构造LinkedNode对象,使用成本更高。
内容的提问来源于stack exchange,提问作者Tmldude
相关产品推荐
相关产品推荐

