python变量赋值是绑定变量到对象而非复制数据,a = [1,2,3] 创建列表并让a指向它;b = a 使b也指向同一对象,id(a)==id(b)为true;可变对象可原地修改,不可变对象操作会创建新对象。

Python变量赋值的本质是**变量绑定(binding)到对象**,不是复制数据,也不是建立“联动关系”。变量只是对象的标签,赋值操作就是让这个标签指向某个内存中的对象。
变量不存值,只存引用
执行 a = [1, 2, 3] 时,Python 做了两件事:在内存中创建一个列表对象;再把名字 a 绑定到它。变量 a 本身不装数字,只保存该列表在内存里的地址。
当你写 b = a,不是把 [1, 2, 3] 复制一份给 b,而是让 b 也贴到同一个列表对象上。此时 id(a) == id(b) 为 True,说明它们指向同一块内存。
可变对象与不可变对象行为不同
区别不在“能不能重新赋值”,而在于“能不能就地修改内容”:
立即学习“Python免费学习笔记(深入)”;
- 对 list、dict、set 这类可变对象,调用 .append()、.pop()、dict[key] = val 等操作,会直接改原对象——所有引用它的变量都能看到变化
- 对 int、str、tuple 这类不可变对象,“a += 1” 或 “s += 'x'” 实际是创建新对象,再让 a 或 s 指向它,原引用不变
赋值 ≠ 同步更新,重绑定不影响其他变量
= 是重绑定操作,不是建立引用通道。比如:
curr.next = list1 → 让 curr.next 指向 list1 当前所指节点
list1 = list1.next → 只是让 list1 这个名字换了个指向,curr.next 仍牢牢连着原来的节点
这就是链表合并中结构不崩的关键:改变“谁在指”,不等于改变“所指之物”。
如何避免意外共享?
当需要独立副本时,不能只靠 =:
- 列表浅拷贝:new = old.copy() 或 new = old[:](仅第一层独立)
- 嵌套结构深拷贝:import copy; new = copy.deepcopy(old)
- 函数内想保护入参:def func(data): safe = data.copy()(对 list/dict 有效)









