【Python】初步学习深拷贝和浅拷贝,copy和deepcopy。或者叫做深复制和浅复制

前几天在万门大学上学习列表list的操作,突然老师说到浅复制和深复制,稀里糊涂听了一下,没听懂,我就快进了。

 

前几天又看了一个测试大牛的面试题,里面就说到python的装饰器、深拷贝和浅拷贝。哇塞,面试居然问这个,我赶紧去认真学习了一下。

https://mp.weixin.qq.com/s/IP7CExenlKGzkSTA-sOkWA

 

以下是基于我个人的理解,可能不准确,或者不全面。

在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题。

为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用。

为了生成这个副本,就产生了拷贝。

a = [[1,2,3],4,5,6]

1、正常赋值,b=a。 如果a发生变化,b也同步变化。

2、浅拷贝,b=a.copy()。如果a后面的4,5,6发生变化,b不变化。 如果a前面的[1,2,3]发生变化,b同步变化。

3、浅拷贝,import copy ; b=copy.copy(a)。如果a后面的4,5,6发生变化,b不变化。 如果a前面的[1,2,3]发生变化,b同步变化。    

      a里面的父对象不跟随变化,子对象跟随变化。

4、深拷贝,import copy ; b=copy.deepcopy(a)。无论a如何变化,b不变化。 

 

import copy
num_group = [[1,2,3],[4,5,6],7,8,9] # 里面额外还有2个子列表
num_group_copy = num_group  # 赋值
num_group_copy1 = num_group.copy() # 浅拷贝
num_group_shallow = copy.copy(num_group) # 浅拷贝
num_group_deep = copy.deepcopy(num_group) # 深拷贝

num_group.append('父列表插入数据') # 后面插入10
num_group[0].append('子列表插入数据')  # 第1个子列表插入数据

print('***************原始数据:',num_group,id(num_group),id(num_group[0]))
print('***********赋值后的结果:',num_group_copy,id(num_group_copy),id(num_group_copy[0]))
# 赋值后的数据,父子列表的存储id都是一模一样的
print('第一种浅拷贝方法后的结果:',num_group_copy1,id(num_group_copy1),id(num_group_copy1[0]))
print('第二种浅拷贝方法后的结果:',num_group_shallow,id(num_group_shallow),id(num_group_shallow[0]))
# 赋值后的数据,父列表的存储id是新的,但是子列表和原始数据一致,当原始数据的子列表变化时,浅拷贝后的子列表也会同步变化
print('*********深拷贝后的结果:',num_group_deep,id(num_group_deep),id(num_group_deep[0]))
# 深拷贝后的数据,父子列表的存储id完全不一样,无论原始数据如何修改,深拷贝后的父子列表都不会变化

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值