简述python中的深浅拷贝
说到什么是深浅拷贝,就不得不说python中赋值的含义,赋值并不是拷贝,而是将target(变量名)和object(对象本身)建立了一种联系,当一个object可变时,连接该object的任意一个target改变该object值都会影响其他连接该object的target的取值。如:
1 2 3 4 5 6 7 | >>> a = [ 1 , 2 , 3 ] >>> b = a >>> b[ 0 ] = 0 >>> b [ 0 , 2 , 3 ] >>> a [ 0 , 2 , 3 ] |
那如果只想改变一个mutable object的值,而它原来的值还保留,该怎么办呢?答案就是拷贝,通过python 内建库copy。
而拷贝又分为深拷贝(copy.deepcopy)和浅拷贝(copy.copy),深浅拷贝的区别在于对“复合对象”(即该对象还包含了其他对象,如list,dict等)时拷贝的不同:
对于浅拷贝,新建一个“复合对象”,该对象包含的是被拷贝对象的reference;
对于深拷贝,新建一个“复合对象”,尽量的把被拷贝对象中含有的对象全都深拷贝;
如:
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 39 40 | - - - - - - - - - - - - - - - - - - - - - - - - - shallow copy - - - - - - - - - - - - - - - - - - - >>> a = [ 1 , 2 , 3 ] >>> c = a.copy() >>> c [ 0 , 2 , 3 ] >>> c[ 0 ] = 4 >>> c [ 4 , 2 , 3 ] >>> a [ 0 , 2 , 3 ] >>> d = [[ 0 , 1 ], 2 , 3 ] >>> e = d.copy() >>> e[ 0 ][ 0 ] = 100 >>> e [[ 100 , 1 ], 2 , 3 ] >>> d [[ 100 , 1 ], 2 , 3 ] - - - - - - - - - - - - - - - - - - - - - - deep copy - - - - - - - - - - - - - - - - - - - - - - - - - - >>> import copy >>> f = copy.deepcopy(d) >>> d [[ 100 , 1 ], 2 , 3 ] >>> f [[ 100 , 1 ], 2 , 3 ] >>> f[ 0 ][ 0 ] = 5 >>> f [[ 5 , 1 ], 2 , 3 ] >>> d [[ 100 , 1 ], 2 , 3 ] >>> g = [[[ 1 ], 2 ]] >>> h = copy.deepcopy(g) >>> h[ 0 ][ 0 ][ 0 ] = 100 >>> h [[[ 100 ], 2 ]] >>> g [[[ 1 ], 2 ]] |
当然,对于list,dict自身的copy方法都是shallow copy
#####
愿你一寸一寸地攻城略地,一点一点地焕然一新
#####
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix