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
相关产品推荐
相关产品推荐

