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

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

运行逻辑拆解

  1. 执行head = Node(val_list[0])时,内存中创建第一个Node实例,head变量存储了这个实例的内存地址,指向该实例
  2. 执行tail = head时,没有创建新对象,只是给第一个Node实例新增了tail引用标签,此时head和tail指向完全相同的节点
  3. 首次进入循环:
    • 执行tail.next = Node(ele):修改tail指向的第一个节点的next属性,因为head也指向同一个节点,所以head.next会同步更新为新创建的第二个节点
    • 执行tail = tail.next:给tail这个引用标签更换指向,现在tail指向第二个节点,head的指向不受影响,仍然指向第一个节点
  4. 后续循环重复上述操作:每次先修改当前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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:06:03