You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python类引用如何自动填充属性?链表节点实例解析

理解Python中链表节点的引用机制

要搞懂这个问题,核心得先记住:Python里的变量只是贴在对象上的标签,不是装对象的盒子。所有ListNode实例这类对象都存在内存里,变量只是用来指向它们的名字,多个变量可以同时指向同一个对象。我们一步步拆解你的代码逻辑:

第一阶段:初始化后的引用关系

执行完这段代码:

x = ListNode(3)
headNode = x
y = ListNode(4) 
x.next = y 

内存里的对象和变量指向是这样的:

  • x 和 headNode 都指向val=3的ListNode实例(记为对象A)
  • y 指向val=4的ListNode实例(记为对象B)
  • 对象A的next属性被设置为指向对象B

所以此时headNode.next就是对象B,而B的next默认是None,所以headNode.next.next输出None,和你看到的结果一致。

第二阶段:修改变量指向后的关键操作

接下来执行这三行代码:

x = y 
y = ListNode(4) 
x.next = y 

我们逐行看变化:

  1. x = y:这行只是把x这个标签从对象A上撕下来,贴到y当前指向的对象B上。现在x和y都指向对象B。
  2. y = ListNode(4):创建了一个全新的val=4的ListNode实例(记为对象C),然后把y的标签从对象B上移到对象C上。这时候x仍然指向对象B,不受y的变化影响。
  3. x.next = y:x指向对象B,所以这行本质是修改对象B的next属性,让它指向y当前指向的对象C。

为什么headNode的next.next会变化?

headNode自始至终都指向对象A,而对象A的next一直指向对象B。当你通过x.next = y修改了对象B的next属性后,headNode.next.next其实就是对象B的next,自然就从原来的None变成了对象C,所以输出会显示它的val是4。

这和Python“识别不同实例ID”没关系,纯粹是变量指向和对象属性修改的逻辑:你修改的是headNode.next(也就是对象B)的next属性,所以headNode能感知到这个变化。

最后执行x = y只是把x的标签移到对象C上,不影响已经形成的链表结构,所以最终输出的链表是[3] -> [4] -> [4]。

内容的提问来源于stack exchange,提问作者JoshJohnson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 23:53:10