龙空技术网

两分钟掌握在python的深拷贝与浅拷贝

自由坦荡的湖泊AI 114

前言:

此时同学们对“python中深复制和浅复制”大约比较着重,朋友们都需要知道一些“python中深复制和浅复制”的相关文章。那么小编在网络上网罗了一些对于“python中深复制和浅复制””的相关资讯,希望我们能喜欢,各位老铁们快快来学习一下吧!

Python中的深拷贝和浅拷贝是两种不同的对象复制方式,它们的区别在于是否复制对象内部的子对象。深拷贝会完全复制一个对象及其所有的子对象,创建一个新的独立的对象;浅拷贝只会复制一个对象的引用,不会复制其子对象,如果原对象改变,浅拷贝的对象也会受到影响。为了更好地理解深拷贝和浅拷贝,可以看一些代码示例:

# 导入copy模块,它提供了深拷贝和浅拷贝的函数import copy# 定义一个列表a,它包含一个嵌套的列表[3, 4]a = [1, 2, [3, 4]]# 使用赋值操作符=来复制a,得到bb = a# 使用copy.copy函数来浅拷贝a,得到cc = copy.copy(a)# 使用copy.deepcopy函数来深拷贝a,得到dd = copy.deepcopy(a)# 打印a, b, c, d的值和idprint(a, id(a)) # [1, 2, [3, 4]] 140424457381568print(b, id(b)) # [1, 2, [3, 4]] 140424457381568print(c, id(c)) # [1, 2, [3, 4]] 140424457381696print(d, id(d)) # [1, 2, [3, 4]] 140424457381824# 修改a中的第一个元素为0a[0] = 0# 打印a, b, c, d的值和idprint(a, id(a)) # [0, 2, [3, 4]] 140424457381568print(b, id(b)) # [0, 2, [3, 4]] 140424457381568print(c, id(c)) # [1, 2, [3, 4]] 140424457381696print(d, id(d)) # [1, 2, [3, 4]] 140424457381824# 修改a中的嵌套列表中的第一个元素为5a[-1][0] = 5# 打印a, b, c, d的值和idprint(a, id(a)) # [0, 2, [5, 4]] 140424457381568print(b, id(b)) # [0, 2, [5, 4]] 140424457381568print(c, id(c)) # [1, 2, [5, 4]] 140424457381696print(d, id(d)) # [1, 2, [3, 4]] 140424457381824

从上面的代码中,可以看到以下几点:

赋值操作符=只是将一个变量指向另一个变量所指向的对象,并不会创建新的对象。所以a和b指向同一个列表对象,它们的id相同,如果修改其中一个变量,另一个变量也会跟着改变。浅拷贝copy.copy函数会创建一个新的对象,并将原对象中的元素复制过来。但是如果元素是可变对象,如列表、字典等,那么浅拷贝只会复制它们的引用,而不会复制它们本身。所以c是一个新的列表对象,它和a的id不同,但是c中的嵌套列表和a中的嵌套列表是同一个对象,它们的id相同。如果修改c中不可变元素(如整数),那么不会影响a;但是如果修改c中可变元素(如嵌套列表),那么也会影响a。深拷贝copy.deepcopy函数会创建一个新的对象,并将原对象中的所有元素(包括可变对象)都复制过来。所以d是一个新的列表对象,它和a的id不同,而且d中的嵌套列表也是一个新的列表对象,它和a中的嵌套列表的id不同。如果修改d中的任何元素,都不会影响a。

标签: #python中深复制和浅复制