
python 中所有变量都存储对象的引用,赋值操作复制的是引用而非对象本身;修改变量指向(如 `a = b.next`)不会影响其他已保存该引用的变量,但修改对象状态(如 `a.val = 5`)会影响所有引用该对象的地方。
在 LeetCode 的链表合并题中,关键行为如下:
curr.next = list1 # 步骤①:将 list1 当前引用的 ListNode 对象地址存入 curr.next list1 = list1.next # 步骤②:让 list1 变量指向下一个节点(即更新 list1 的引用)
这两步是完全独立的:步骤①仅把 list1 当时所指的对象地址“快照”式地赋给了 curr.next;步骤②只是改变了 list1 这个变量自身持有的引用,对 curr.next 中已存的引用毫无影响。这就像把一张照片贴在墙上(curr.next),再让拍照的人(list1)走到别处——墙上的照片不会因此改变。
对比你提供的列表示例:
a = [] b = [1] a = b # a 和 b 现在引用同一个 list 对象 b.append(2) # 修改该 list 对象的状态 → a 也能看到变化 print(a) # [1, 2]
这里 a 和 b 始终指向同一个可变对象,append() 是对对象内容的原地修改(mutating operation),所以通过任一引用都能观察到。
立即学习“Python免费学习笔记(深入)”;
而链表代码中的 list1 = list1.next 并非修改对象,而是重绑定变量(rebinding):list1 从指向节点 A 变为指向节点 B,但 curr.next 仍牢牢持有节点 A 的引用。若想让 curr.next “跟随”变化,必须显式更新它,例如:
curr.next = list1 curr.next.val = 999 # ✅ 修改节点 A 的属性 → 所有引用 A 的地方都可见 # 但 list1 = list1.next ❌ 不会影响 curr.next 的指向
✅ 核心总结:
- ✦ = 是引用赋值(binding),不是“建立联动关系”;
- ✦ 修改变量引用(x = y.next)不影响其他变量;
- ✦ 修改对象属性(x.val = ...)或调用可变方法(.append(), .pop())会影响所有引用该对象的变量;
- ✦ 区分「改变谁在指」和「改变所指之物」——这是理解 Python 对象模型的关键。










