python的浅拷贝和深拷贝

概念介绍

  • 浅拷贝:只拷贝最外层的对象,不会拷贝对象内部的子对象。
  • 深拷贝:拷贝最外层以及对象内部的所有子对象。

在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]

以上就是浅拷贝和深拷贝的介绍,尤其深拷贝在处理可变数据结构或者嵌套结构的对象时特别有用。

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习,点个赞和关注吧,谢谢大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科雷learning

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值