概念介绍
- 浅拷贝:只拷贝最外层的对象,不会拷贝对象内部的子对象。
- 深拷贝:拷贝最外层以及对象内部的所有子对象。
在Python中,我们经常使用copy模块来实现浅拷贝和深拷贝。
浅拷贝使用copy.copy函数,深拷贝使用copy.deepcopy函数。
浅拷贝介绍
先通过一个列表的copy示例看下什么是浅拷贝,创建一个list(列表中第6个元素也是一个列表),使用list的copy函数(类似于copy模块的copy函数),复制一个对象
ListA = [1,2,3,4,5,[1,2,3]]
1)使用list.copy()函数复制列表给另一个变量
ListB = ListA.copy()
打印两个列表,结果显示一样的元素。
print(f'列表ListA : {ListA}')
print(f'列表ListB : {ListB}')
结果:
列表ListA : [1, 2, 3, 4, 5, [1, 2, 3]]
列表ListB : [1, 2, 3, 4, 5, [1, 2, 3]]
2)修改ListA第1个元素的值
ListA[0] = 10
打印listA和listB的第一个元素的值
print(f'列表ListA index=0的值 : {ListA[0]}')
print(f'列表ListB index=0的值 : {ListB[0]}')
结果:显示两个列表第一个元素的值不同,说明listB复制后的元素指向了新地址
列表ListA index=0的值 : 10
列表ListB index=0的值 : 1
3)修改第6个元素的第1个位置的值
ListA[5][0] = 10
打印listA和listB的第6个元素的值
print(f'列表ListA index=5的值: {ListA[5]}')
print(f'列表ListA index=5的值 : {ListB[5]}')
结果:显示两个列表第6个元素的值相同,说明listB复制后的第6个元素跟listA中第6个元素指向的是同一个地址,并没有复制第6个元素对象。而且因为列表是可变数据结构,所以当修改列表A的元素时,其实列表B也一起被修改了(平常在编写代码时一定要注意这个细节)
列表ListA index=5的值: [10, 2, 3]
列表ListA index=5的值 : [10, 2, 3]
通过以上的示例,相信大家就清楚了浅拷贝的概念了。
PS:除了列表,字典dict和集合set也具有相同的copy函数,也属于浅拷贝。
所以像列表和字典集合的复制也可以使用copy模块的copy函数。
深拷贝介绍
1)还是通过上面的list的示例,我们使用copy.deepcopy函数拷贝列表
import copy
ListB = copy.deepcopy(ListA)
同样修改listA第6个元素的第1个位置的值
打印listA和listB的第6个元素的值
print(f'列表ListA index=5的值: {ListA[5]}')
print(f'列表ListA index=5的值 : {ListB[5]}')
结果:显示两个列表第6个元素的值不同,说明listB复制后的第6个元素跟listA中第6个元素指向的不是同一个地址。所以当修改listA中的值时并不影响listB中的值。
列表ListA index=5的值: [10, 2, 3]
列表ListA index=5的值 : [1, 2, 3]
2)定义一个数字列表,定义一个函数,形参为一个列表,在函数中对列表内容做处理。
listA = [1,2,3,4,5,6,7,8,9]
def mod_list(list_a):
for index,j in enumerate(list_a):
if j % 2 ==0:
del list_a[index]
list_a.append(j+10)
return list_a
print(mod_list(listA))
print(listA)
程序执行后,结果显示列表A的内容已经被修改了。
[1, 3, 5, 7, 9, 14, 18, 26, 42]
[1, 3, 5, 7, 9, 14, 18, 26, 42]
如果需要传入的列表不被修改,使用深拷贝,添加一句list_b = copy.deepcopy(list_a)
def mod_list(list_a):
list_b = copy.deepcopy(list_a)
...
程序执行后结果显示原列表listA不会被修改。
[1, 3, 5, 7, 9, 14, 18, 26, 42]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
以上就是浅拷贝和深拷贝的介绍,尤其深拷贝在处理可变数据结构或者嵌套结构的对象时特别有用。
共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”
-----指水滴不断地滴,可以滴穿石头;
-----比喻坚持不懈,集细微的力量也能成就难能的功劳。
----感谢读者的阅读和学习,点个赞和关注吧,谢谢大家。