04-Python-深浅拷贝机制

假设我们有两个需求:

  1. 拷贝一个原列表,产生一个新列表
  2. 想让两个列表完全独立开,效果为List1改了List2不改,针对的是改操作的独立

对于上述需求,我们有两个不同的功能解决方法,即浅拷贝和深拷贝

浅拷贝

浅拷贝是把第一层,不管是可变还是不可变类型,一股脑的拷贝给新列表。
浅拷贝是不加区分,完全拷贝给新列表,这对不可变类型是没问题的,但是对可变类型,两个数据就粘在一起了
执行效果差别:

# 如何Copy列表
import copy

list1 = ['1', '2', ['3','4','5']]
list2 = list1.copy()
list1[0] = '2'
print("list1=",list1,"list1_id=",id(list1))  # 结果为list1= ['2', '2', ['3', '4', '5']] list1_id= 2624156334400
print("list2=",list2,"list2_id=",id(list2))  # 结果为list2= ['1', '2', ['3', '4', '5']] list2_id= 2624156334336
list1[2][0] = '9'
print("list1=",list1)  # 结果为list1= ['2', '2', ['9', '4', '5']] 
print("list2=",list2)  # 结果为list2= ['2', '2', ['9', '4', '5']] 

实际内存地址差别:

# 如何Copy列表
import copy

list1 = ['1', '2', ['3','4','5']]
list2 = list1.copy()
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list2[0]),id(list2[1]),id(list2[2]))
'''
运行结果如下:
1787387503088 1787390132080 1787390097856
1787387503088 1787390132080 1787390097856
'''

堆区内发生的事情如下:
在这里插入图片描述

深拷贝

执行效果差别

# 如何Copy列表
import copy
list1 = ['1', '2', ['3','4','5']]
list2 = copy.deepcopy(list1)
list1[0] = '2'
print("list1=",list1,"list1_id=",id(list1))  # 结果为list1= ['2', '2', ['3', '4', '5']] list1_id= 1421097367936
print("list2=",list2,"list2_id=",id(list2))  # 结果为list2= list2= ['1', '2', ['3', '4', '5']] list2_id= 1421097367872
list1[2][0] = '9'
print("list1=",list1)  # 结果为list1= ['2', '2', ['9', '4', '5']] 
print("list2=",list2)  # 结果为list2= ['1', '2', ['3', '4', '5']]

实际内存地址差别

# 如何Copy列表
import copy

list1 = ['1', '2', ['3','4','5']]
list2 = copy.deepcopy(list1)
print(id(list1[0]),id(list1[1]),id(list1[2]))
print(id(list2[0]),id(list2[1]),id(list2[2]))

'''
运行结果如下:
2148391772656 2148396648880 2148397905984
2148391772656 2148396648880 2148398012224
'''

堆区内发生事情如下:
深拷贝堆区内发生的事情

可以看到深拷贝更加合理,浅拷贝只拷贝了第一层,而深拷贝考虑的更多,每一层都拷贝,底层原理是深拷贝对可变不可变类型加以了区分。虽然没有浅拷贝省空间,但是不会对拷贝后的列表进行修改不会影响新列表。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小蓝学不会嵌入式!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值