Python学习 - Python中深拷贝与浅拷贝的区别?
首先,我们知道 Python 中有6个标准的数据类型,他们又分为可以变和不可变。
不可变:Number(数字)、String(字符串)、Tuple(元组)。
可以变:List(列表)、Dictionary(字典)、Set(集合)。
浅拷贝
改变原始对象中为可变类型的元素的值,会同时影响拷贝对象。
改变原始对象中为不可变类型的元素的值,不会响拷贝对象。
代码演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | import copy #定义一个列表,其中第一个元素是可变类型。 list1 = [[ 1 , 2 ], 'fei' , 66 ]; #进行浅copy list2 = copy.copy(list1); #对象地址是否相同。 print ( id (list1)); print ( id (list2)); #结果:不同 46177816 46177936 #第一个元素地址是否相同。 print ( id (list1[ 0 ])); print ( id (list2[ 0 ])); #结果:相同 46240432 46240432 #第二个元素地址是否相同。 print ( id (list1[ 1 ])); print ( id (list2[ 1 ])); #结果:相同 45547328 45547328 #改变第一个值,查看复制对象变化。 list1[ 0 ][ 0 ] = 2 ; print (list2); #结果:复制对象发生变化 [[ 2 , 2 ], 'fei' , 66 ] #改变第二个值,查看复制对象变化。 list1[ 1 ] = 'ge' ; print (list2); #结果:复制对象没发生变了 [[ 2 , 2 ], 'fei' , 66 ] |
深拷贝
深拷贝,除了顶层拷贝,还对子元素也进行了拷贝。
经过深拷贝后,原始对象和拷贝对象所有的可变元素地址都没有相同的了。
代码演示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | import copy #定义一个列表,其中第一个元素是可变类型。 list1 = [[ 1 , 2 ], 'fei' , 66 ]; #进行深copy list2 = copy.deepcopy(list1); #对象地址是否相同。 print ( id (list1)); print ( id (list2)); #结果:不同 46177816 46177936 #第一个元素地址是否相同。 print ( id (list1[ 0 ])); print ( id (list2[ 0 ])); #结果:不同 49123856 49588784 #第二个元素地址是否相同。 print ( id (list1[ 1 ])); print ( id (list2[ 1 ])); #结果:相同 45547328 45547328 #改变第一个值,查看复制对象变化。 list1[ 0 ][ 0 ] = 2 ; print (list2); #结果:复制对象没发生变了 [[ 1 , 2 ], 'fei' , 66 ] #改变第二个值,查看复制对象变化。 list1[ 1 ] = 'ge' ; print (list2); #结果:复制对象没发生变了 [[ 1 , 2 ], 'fei' , 66 ] |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?