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

Python3中空链表节点赋值操作影响及合并链表dummy逻辑疑问

Python中赋值与链表操作的差异解析

一、不可变类型的赋值行为

以整数这类不可变类型为例,看这段代码:

x = 0
y = x
y += 1
print(x)  # 输出0

整数属于不可变类型,执行y = x时,y和x指向同一个整数对象0。但y += 1本质是创建了新的整数对象1,并让y指向这个新对象,x仍保留对原对象0的引用,所以x的值不会改变。

二、链表节点(可变类型)的赋值行为

链表的ListNode是自定义类的实例,属于可变类型。拿合并有序链表的典型逻辑举例:

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def merge_two_lists(l1, l2):
    dummy = ListNode()
    tail = dummy
    while l1 and l2:
        if l1.val < l2.val:
            tail.next = l1
            l1 = l1.next
        else:
            tail.next = l2
            l2 = l2.next
        tail = tail.next
    tail.next = l1 if l1 else l2
    return dummy.next

tail = dummy执行后,tail和dummy指向同一个ListNode对象。后续的tail.next = ...操作,是在修改这个共享对象的next属性,而非让tail指向新对象。因此dummy的next属性会同步被修改,最终通过dummy.next就能拿到合并后的链表头节点。

三、核心疑问解答

对赋值给另一变量的链表节点执行属性修改操作(比如修改next),会改变原节点。因为两个变量指向同一个可变对象,修改对象的内部属性会影响所有指向它的变量。

但如果是直接给变量重新赋值(比如tail = ListNode(2)),此时tail会指向新的ListNode对象,和dummy不再关联,这种操作不会影响原节点dummy。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:23:14