Python高级(二):浅拷贝与深拷贝
浅拷贝和深拷贝
浅拷贝:对引用的拷贝,拷贝的是地址。原对象中的可变类型改变,拷贝也会改变。不可变类型改变,拷贝不变。
深拷贝:对对象的资源的拷贝,拷贝的是值。原对象改变,拷贝对象不会改变
首先,对赋值操作我们要有以下认识:
- 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 )。
- 修改不可变对象(str、tuple)需要开辟新的空间
- 修改可变对象(list等)不需要开辟新的空间
浅拷贝
- 浅拷贝仅仅复制了容器中元素的地址
import copy
a = ['hello', [1, 2, 3]]
b = copy.copy(a)
print('原容器:', a, '地址:', [id(i) for i in a])
print('浅拷贝:', b, '地址:', [id(j) for j in b])
原容器: ['hello', [1, 2, 3]] 地址: [2719850669312, 2719853248072]
浅拷贝: ['hello', [1, 2, 3]] 地址: [2719850669312, 2719853248072]
- 浅拷贝--当不可变类型的值改变的时候,地址改变,浅拷贝取原地址的值,所以不变。当可变类型的值改变时,地址不变,所以浅拷贝中的元素相应改变。
import copy
a = ['hello', [1, 2, 3]]
b = copy.copy(a)
print('原容器:', a, '地址:', [id(i) for i in a])
print('浅拷贝:', b, '地址:', [id(j) for j in b])
a[0] = 'world'
a[1].append(4)
print('原容器修改后:', a, '地址:', [id(i) for i in a])
print('原容器修改后的浅拷贝:', b, '地址:', [id(j) for j in b])
原容器修改后: ['world', [1, 2, 3, 4]] 地址: [2719850669480, 2719853248072]
原容器修改后的浅拷贝: ['hello', [1, 2, 3, 4]] 地址: [2719850669312, 2719853248072]
总结
浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。
深拷贝
- 深拷贝完全拷贝了一个副本
import copy
a = ['hello', [1, 2, 3]]
c = copy.deepcopy(a)
print('原容器:', a, '地址:', [id(i) for i in a])
print('深拷贝:', c, '地址:', [id(j) for j in c])
原容器: ['hello', [1, 2, 3]] 地址: [3100654871808, 3100657450568]
深拷贝: ['hello', [1, 2, 3]] 地址: [3100654871808, 3100657450248]
- 深拷贝--修改原容器中的元素,不影响深拷贝
import copy
a = ['hello', [1, 2, 3]]
c = copy.deepcopy(a)
print('原容器:', a, '地址:', [id(i) for i in a])
print('深拷贝:', c, '地址:', [id(j) for j in c])
a[0] = 'world'
a[1].append(4)
print('原容器修改后:', a, '地址:', [id(i) for i in a])
print('原容器修改后深拷贝:', c, '地址:', [id(j) for j in c])
原容器修改后: ['world', [1, 2, 3, 4]] 地址: [3100654871976, 3100657450568]
原容器修改后深拷贝: ['hello', [1, 2, 3]] 地址: [3100654871808, 3100657450248]
总结
深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。也就是说( 新瓶装新酒 )。
作者: 是小鱼呀
出处:https://www.cnblogs.com/sophia12138/p/16368145.html
本站使用「CC BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)