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
我们逐行看变化:
x = y:这行只是把x这个标签从对象A上撕下来,贴到y当前指向的对象B上。现在x和y都指向对象B。y = ListNode(4):创建了一个全新的val=4的ListNode实例(记为对象C),然后把y的标签从对象B上移到对象C上。这时候x仍然指向对象B,不受y的变化影响。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
相关产品推荐
相关产品推荐

