python中的深浅拷贝问题
1.浅拷贝
1.1 对于无嵌套类型的浅复制
L = [1, 'Tom', '成都']
L1 = L.copy() # 内存地址不一样
L[1] = '上海'
L1[2] = 'Hello'
L1.append('##')
print(L) # [1, '上海', '成都']
print(L1) # [1, 'Tom', 'Hello', '##']
1.2 对于有嵌套类型的浅复制
L = [1, 'Tom', [22, '成都']]
L1 = L.copy() # 外层内存地址不一样,嵌套部分的内存地址一样
L1[2][0] = 'Hello'
L[2].append('##')
print(L) # [1, 'Tom', ['Hello', '成都', '##']]
print(L1) # [1, 'Tom', ['Hello', '成都', '##']]
2.深复制
跟浅复制不一样的是,深复制不仅复制了内存空间的内容,更复制了内存空间后的指向,即通过深复制后的两个列表没有一点儿关联关系
import copy
L = [1, 'Tom', [22, '成都']]
L1 = L.deepcopy() # 外层和嵌套内层的内存地址都不一样
L1[2][0] = 'Hello'
L[2].append('##')
print(L) # [1, 'Tom', [22, '成都', '##']]
print(L1) # [1, 'Tom', ['Hello', '成都']]
3.总结:
无论对于深拷贝还是浅拷贝,对于无嵌套的列表来说,对拷贝前的源列表或拷贝后的新列表的修改都不应该另一个列表的元素;而对于有嵌套的列表的来说,浅拷贝对嵌套列表的修改将影响两个列表的值;深拷贝则不影响。
浅拷贝:嵌套的可变数据类型是同一个
深拷贝:嵌套的可变数据类是不是同一个
4.赋值运算和切片
L = [1, '#', ['Tom', '上海']]
L1 = L # 内存地址一模一样
L[1] = 4
del L1[2][0]
print(L) # [1, 4, ['上海']]
print(L1) # [1, 4, ['上海']]
2.切片
# 切片等同于浅复制
L = [1, '#', ['Tom', '上海']]
L1 = L[:] # 外层内存地址不一样,嵌套部分内存地址一样
print(id(L)) # 139780854130760,外层内存地址不一样
print(id(L1)) # 139780854131016
print(id(L[2])) # 139780855161544,嵌套部分内存地址一样
print(id(L1[2])) # 139780855161544
L[1] = 4
print(L) # [1, 4, ['Tom', '上海']]
print(L1) # [1, '#', ['Tom', '上海']]
del L1[2][0]
print(L) # [1, 4, ['上海']]
print(L1) # [1, '#', ['上海']]
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· 大模型工具KTransformer的安装
· [计算机/硬件/GPU] 显卡