Python中B=A后修改B会改动A吗?为何链表tail更新会修改head的next属性
问题解答:Python实例赋值逻辑与链表尾插法原理解析
一、赋值操作B = A的修改影响说明
结论
修改B是否会影响A,取决于你执行的是哪种修改操作:
- 若修改的是B指向对象的内部可变属性/元素(比如自定义实例的属性、列表的元素、字典的键值),则A会同步变化
- 若直接给B重新赋值(比如
B = 其他对象),则完全不会影响A
底层原理
Python中的变量本质是对象引用,变量存储的不是对象本身,而是内存中实际对象的地址。执行B = A时,系统不会创建新的对象副本,只是给内存里已经存在的A指向的对象,新增了一个名为B的引用标签,此时A、B指向内存中完全相同的同一个实例。
补充:如果A是整数、字符串、元组这类不可变对象,你无法修改它的内部状态,所有看起来的「修改」本质都是给变量重新赋值新的对象,所以这种场景下修改B不会影响A。
二、链表尾插法代码的逻辑解释
你提供的代码修正缩进后如下:
# Node类定义 class Node(object): def __init__(self,x): self.val = x self.next = None # 根据给定列表用尾插法生成链表,返回头节点 def creat_link_tail(val_list): head = Node(val_list[0]) tail = head for ele in val_list[1:]: tail.next = Node(ele) tail = tail.next return head lkt = creat_link_tail([5, 3, 2, 6, 7]) # 生成的链表为 5->3->2->6->7
运行逻辑拆解
- 执行
head = Node(val_list[0])时,内存中创建第一个Node实例,head变量存储了这个实例的内存地址,指向该实例 - 执行
tail = head时,没有创建新对象,只是给第一个Node实例新增了tail引用标签,此时head和tail指向完全相同的节点 - 首次进入循环:
- 执行
tail.next = Node(ele):修改tail指向的第一个节点的next属性,因为head也指向同一个节点,所以head.next会同步更新为新创建的第二个节点 - 执行
tail = tail.next:给tail这个引用标签更换指向,现在tail指向第二个节点,head的指向不受影响,仍然指向第一个节点
- 执行
- 后续循环重复上述操作:每次先修改当前
tail指向节点的next属性(给当前最后一个节点拼接新节点),再把tail的指向移动到新的最后一个节点上,全程不会修改head的指向,最终返回的head就可以顺着next属性遍历到完整的链表
验证小例子
你可以执行这段代码验证引用逻辑:
n1 = Node(1) n2 = n1 # 修改指向对象的属性,两个引用同步生效 n2.val = 2 print(n1.val) # 输出 2 # 给n2重新赋值,不会影响n1的指向 n2 = Node(3) print(n1.val) # 仍然输出 2
内容的提问来源于stack exchange,提问作者Tang Smith
相关产品推荐
相关产品推荐

