python 深拷贝、浅拷贝

  • 实验环境:Python 3.7.5,macOS Mojave 10.14.6
如何理解深拷贝、浅拷贝?
  • 深拷贝 递归的拷贝父类及子类,深拷贝的对象与源对象相互独立,没有数据关联
  • 浅拷贝 仅拷贝父类,浅拷贝的对象与源对象不一定相互独立,若存在子类,仍然有关联性

与C++中的概念类似。通俗的说,深拷贝就是数据完全独立不共享,单独分配内存;浅拷贝就是部分数据是共享的,比如指针。

python可以通过载入copy模块实现深、浅拷贝,下面通过代码说明两者的区别:

  • 深拷贝
In [1]: import copy                                                                                                                                                                                                                      
In [2]: a = [[1,3],5,7]                                                                                                                                                                                                                  
In [3]: b = copy.deepcopy(a)		# deepcopy()                                                                                                                                                                                                           
In [4]: a == b                                                                                                                                                                                                                           
Out[4]: True

In [5]: a is b                                                                                                                                                                                                                           
Out[5]: False

In [6]: a.append(9)                 # 添加父列表数据                                                                                                                                                                                                     
In [7]: a                                                                                                                                                                                                                                
Out[7]: [[1, 3], 5, 7, 9]

In [8]: b                                                                                                                                                                                                                                
Out[8]: [[1, 3], 5, 7]

In [9]: a[0].append(0)              # 添加子列表数据                                                                                                                                                                                                     
In [10]: a                                                                                                                                                                                                                               
Out[10]: [[1, 3, 0], 5, 7, 9]

In [11]: b                                                                                                                                                                                                                               
Out[11]: [[1, 3], 5, 7]
  • 浅拷贝
In [1]: import copy                                                                                                                                                                                                                      
In [2]: a = [[1,3],5,7]                                                                                                                                                                                                                  
In [3]: b = copy.copy(a)         	# copy()                                                                                                                                                                                                         
In [4]: a == b                                                                                                                                                                                                                           
Out[4]: True

In [5]: a is b                                                                                                                                                                                                                           
Out[5]: False

In [6]: a.append(9)                	# 添加父列表数据                                                                                                                                                                                                      
In [7]: a                                                                                                                                                                                                                                
Out[7]: [[1, 3], 5, 7, 9]

In [8]: b                                                                                                                                                                                                                                
Out[8]: [[1, 3], 5, 7]

In [9]: a[0].append(0)             	# 修改子列表数据                                                                                                                                                                                                      
In [10]: a                                                                                                                                                                                                                               
Out[10]: [[1, 3, 0], 5, 7, 9]

In [11]: b                                                                                                                                                                                                                               
Out[11]: [[1, 3, 0], 5, 7]

从上面的实验结果看,可以得出以下结论

  • 若修改父类数据,深、浅拷贝对拷贝对象没有影响
  • 若修改子类数据,深拷贝对拷贝对象没有影响,浅拷贝会同步修改拷贝的对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值