python变量赋值不复制对象而创建引用,a=b后修改b会影响a;id()可验证引用同一性;浅拷贝共享嵌套对象,深拷贝完全独立;不可变类型重新赋值会改变引用;is判断内存地址是否相同。

当您在Python中执行变量赋值操作时,看似简单的等号“=”背后实际并未复制对象本身,而是创建了对同一内存地址的引用。以下是深入解析这一机制的关键步骤:
一、理解对象与引用的分离
Python中一切皆对象,变量名只是指向对象的标签,而非存储对象数据的容器。赋值操作仅改变标签所指向的内存地址,不触发对象内容的拷贝。
1、定义一个列表对象:a = [1, 2, 3]
2、执行赋值:b = a
立即学习“Python免费学习笔记(深入)”;
3、此时a和b共享同一块内存空间,修改b将同步反映在a上。
二、验证引用关系的方法
通过内置函数id()可获取对象在内存中的唯一标识符,若两个变量id值相同,则证明它们引用同一对象。
1、打印a的内存地址:print(id(a))
2、打印b的内存地址:print(id(b))
3、比较结果:print(id(a) == id(b)) 输出True。
三、区分浅拷贝与深拷贝的影响
浅拷贝(如copy.copy())仅复制最外层容器,内部嵌套对象仍为引用;深拷贝(如copy.deepcopy())则递归复制所有层级的对象,生成完全独立的副本。
1、导入模块:import copy
2、创建嵌套列表:original = [[1, 2], [3, 4]]
3、执行浅拷贝:shallow = copy.copy(original)
4、执行深拷贝:deep = copy.deepcopy(original)
5、修改嵌套元素:original[0][0] = 999
6、观察shallow变化:print(shallow[0][0]) 输出999。
7、观察deep变化:print(deep[0][0]) 输出1。
四、不可变对象的特殊行为
对于int、str、tuple等不可变类型,即使多个变量引用同一对象,重新赋值操作也会使变量指向新对象,原引用关系被切断,不影响其他变量。
1、定义整数:x = 100
2、赋值给y:y = x
3、修改x:x = x + 1
4、检查y值:print(y) 仍输出100。
5、验证地址变化:print(id(x) != id(y)) 输出True。
五、使用is运算符判断引用同一性
“is”用于判断两个变量是否指向完全相同的对象(即内存地址一致),而“==”仅比较值是否相等,二者语义不同。
1、创建字符串:s1 = "hello"
2、赋值:s2 = s1
3、测试引用一致性:print(s1 is s2) 输出True。
4、创建相同内容新字符串:s3 = "hello"
5、再次测试:print(s1 is s3) 在CPython中可能为True(因字符串驻留机制),但不可依赖。










