关于Python中深拷贝与浅拷贝的理解(一)---概念


缘由

用Python也有很长时间了,一直在做科学计算和爬虫采集方面的东西。自己的毕业论文涉及到编写一个科学计算的软件,也是用Python编写。界面采用PyQt

软件的主体前段时间已经写好,最近在试算的时候出现两个问题:

  • 同一种计算方法,点击计算两次,结果会变,后面再点击几次结果保持不变
  • 不同的计算方法,第一次改变计算方法可能结果会变,后面再点击几次结果保持不变
这明显是个bugbug想我当初写好了软件主体,还一时觉得飘飘然,出现了这么低级的bug瞬间感觉自己学Python一年多还是图样。 图样


不管怎样,还是要调试的,所以以上都是废话,talk is cheap,开撸。

找bug

在我构造的类中,有self.original_dataself.result_data两组数据,都是Pandas构造的DataFrame。self.original_data是读取文本存储的原始数据,而self.result_data则是用于存储计算得到的结果数据。
重现了几次bug,之所以出现第二次计算结果变化而后续结果不再变化,应该是输入数据产生了变化。也就是self.original_data。而我程序中也没有对于输入数据的改动。思来想去……结合以前自己闲着没事看的一些技术博客和微信公众号的推送(所以没事多看点东西还是挺重要),将问题锁定在了Python的深拷贝和浅拷贝上。

Python中的深拷贝与浅拷贝概念

其实这个问题在学习Python的过程中应该是一个基础问题,但由于当时没有在意,以至于后面成型软件要整体上进行修改。
网上关于Python深拷贝与浅拷贝的相关介绍有很多,这里列两个:
大体上讲,Python里的赋值符号“=”只是将对象进行了引用,如果想新开辟地址new出一个新对象,要用copy模块的copy.copy(),但是用这个方法得到的对象是新对象,但是数据还是引用。
如果要完全得到一个新的一模一样的对象,要用copy.deepcopy()方法。这样,在改变新对象的时候,原对象才能不受影响,也就是保持原始数据不变。一个简单的例子(转自:http://www.jb51.net/article/15714.htm ):
import copy  
a = [1, 2, 3, 4, ['a', 'b']] #原始对象  
  
b = a #赋值,传对象的引用  
c = copy.copy(a) #对象拷贝,浅拷贝  
d = copy.deepcopy(a) #对象拷贝,深拷贝  
  
a.append(5) #修改对象a  
a[4].append('c') #修改对象a中的['a', 'b']数组对象  
  
print 'a = ', a  
print 'b = ', b  
print 'c = ', c  
print 'd = ', d  
输出为:
a = [1, 2, 3, 4, ['a', 'b', 'c'], 5] 
b = [1, 2, 3, 4, ['a', 'b', 'c'], 5] 
c = [1, 2, 3, 4, ['a', 'b', 'c']] 
d = [1, 2, 3, 4, ['a', 'b']]


还有这篇博客,解释得更加详细一些。


基本就是这样,Python深拷贝与浅拷贝的概念存与此。
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值