关于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
    评论
Python深拷贝浅拷贝是用来复制对象的两种方式。 浅拷贝是创建一个新的对象,但是新对象的内容只是原始对象的引用。也就是说,新对象和原始对象共享相同的数据。这意味着,如果我们修改了新对象,原始对象的数据也会随之改变。浅拷贝可以使用赋值操作符(=)或者使用copy()方法来实现。 [2] 深拷贝则是创建一个新的对象,并且递归地复制原始对象的所有数据。这意味着,新对象和原始对象是完全独立的,它们不共享数据。因此,如果我们修改了新对象,原始对象的数据不会受到影响。深拷贝可以使用copy模块的copy()方法来实现。 [3] 需要注意的是,深拷贝可能会比浅拷贝更耗费时间和内存,因为它需要复制整个对象结构。通常情况下,当我们需要独立的对象,并且不希望原始对象的修改影响到新对象时,可以使用深拷贝。而浅拷贝则更适合处理简单的对象,或者当我们想要共享对象的数据时。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [彻底理解Python浅拷贝深拷贝区别](https://blog.csdn.net/lovedingd/article/details/128257172)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值