python中深拷贝和浅拷贝区别(Python深浅拷贝的理解)
1.拷贝
拷贝实际上其实就是在赋值 ,比如我们有一个列表L1 ,定义另一个列表L2引用列表L1 ,实际上就是在拷贝列表L1的值 ,由于由于L1列表是可变的数据类型 ,所以当L1的值变的时候 ,L2的值也是在跟着变的.那其实就算L1内的是不可变的数据类型 ,L1的内容变化 ,L2的内容也一样会随之变化的
# # 拷贝(赋值) # Python学习交流QQ群:153708845 lt = [1, 2, 3] lt2 = lt lt.append(4) print(lt) # [1, 2, 3, 4] # 因为列表是可变类型 ,所以lt的值变化,lt2的值也会跟着变化 print(lt2) # [1, 2, 3, 4]2.浅拷贝
浅拷贝时 ,我们时需要在写代码前import.copy,导入copy的方法 ,其实列表在内存空间里是以索引的形式存在的,索引指向的才是对应的具体的值 ,那当我们用L2去copy列表L1的时候 ,那他们两个列表的索引只想的值都是一样的,如果L1的某一索引对应的值有变化的时候 ,L2这个列表是否变化是取决于L1列表变化的那个索引的值是否为可变化数据类型 。也就是说当L1列表内的数据是可变化类型的化 ,L2会随之变化:L1列表内的数据是不可变的数据类型 ,那L2列表的数据则不会跟着变化 。
# 浅拷贝 # copy.copy() import copy l1 = [xichen,nick,egon,[rockey,pilipili]] l2 = copy.copy(l1) l1.append(xuchen) print(l1) # [xichen, nick, egon, [rockey, pilipili], xuchen] print(l2) # [xichen, nick, egon, [rockey, pilipili]] l1[-1].append(xucheng) print(l1) # [xichen, nick, egon, [rockey, pilipili, xucheng]] print(l2) # [xichen, nick, egon, [rockey, pilipili, xucheng]]3.深拷贝
深拷贝和浅拷贝一样 ,在写代码之前需要import.copy导入copy的方法 ,但是我们深拷贝的时候用的是deepcopy ,其他的语法和浅拷贝是一样的 ,但是深拷贝和浅拷贝不一样的是 ,深拷贝不管列表L1里面的内容是可变还是不可变的 ,当L1变化的时候,L2列表里面的数据都不会改变的
import copy lt = [1000, 2000, 3000, [4000, 5000, 6000]] print(id(lt),id(lt)) print(id(lt[0]), id(lt[0])) print(id(lt[1]), id(lt[1])) print(id(lt[2]), id(lt[2])) print(id(lt[3]), id(lt[3])) print(* * 50) # id(lt) 2608713900296 # id(lt[0]) 2608710450544 # id(lt[1]) 2608593350352 # id(lt[2]) 2608594909872 # id(lt[3]) 2608713954696 ************************************************** lt2 = copy.deepcopy(lt) print(id(lt2),id(lt2)) print(id(lt2[0]), id(lt2[0])) print(id(lt2[1]), id(lt2[1])) print(id(lt2[2]), id(lt2[2])) print(id(lt2[3]), id(lt2[3])) print(* * 50) # id(lt2) 2608713900616 # id(lt2[0]) 2608710450544 # id(lt2[1]) 2608593350352 # id(lt2[2]) 2608594909872 # id(lt2[3]) 2608713900744 **************************************************总结:
牢记: 拷贝/浅拷贝/深拷贝 只针对可变数据类型 拷贝: 当lt2为lt的拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型变化,lt2变化简单的赋值 浅拷贝:当lt2为lt的浅拷贝对象时,lt内的可变类型变化,lt2变化;lt内的不可变类型变化,lt2不变化copy.copy() 可变数据的类型中的内置方法.copy() 深拷贝: 当lt2为lt的深拷贝对象时,lt内的可变类型变化,lt2不变化;lt内的不可变类型变化,lt2不变copy.deepcopy()创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!