Python的深浅拷贝问题详解(有图,有示例,逐步详解)

本文以Python3以上为学习基础。

目录

浅拷贝1:直接赋值

浅拷贝2:copy()函数

深拷贝:deepcopy()


浅拷贝1:直接赋值

直接上实例,看看下面的现象:

 

我把a直接赋值给b。

我们通过 id() 查看对象在内存中的位置。

可以看到,在a和b在内存中的位置一模一样。

相同的原理,字典的赋值依旧是一样的现象。内存中的位置没有发生改变。

这个就是所谓的:浅拷贝。

我们直白的看看下面这张图:


浅拷贝2:copy()函数

下面我们看看copy()。

第一步:In[181]:我通过copy函数把字典tmp拷贝给tmp1。

第二步:In[182]:利用remove()函数把字典tmp1的键'a'的值中的2给移除出去。

第三步:In[183]:我们查看字典tmp之内。发现tmp居然发生了改变

我们看看两个字典tmp和tmp1在内存中的位置:

很明显 字典tmp 和 字典tmp1 是两个位置。但是为什么我 remove 掉 tmp1 中 键a 的 值2 ,为什么 tmp 也改变了呢?

我们再看一个示例。

第一步:我通过copy函数把字典tmp拷贝给tmp1。

第二步:修改tmp1中 键b 的 值

第三步:查看 字典tmp 的内容。

很明显:这时候tmp没有改变。

我们看看两操作之间的区别:

第一次copy操作的对象是键值对:'a':[1,2,3]

第二次copy操作的对象是键值对:'b':2

区别:

  • 第一次操作的对象 键a 的值是列表[1,2,3]。
  • 第二次操作的对象 键b 的值是一个int类型的2

最根本原因:

和python存储的数据类型特点有关,python只存储基本类型的数据,比如int类型,str类型,对于非基础类型的,比如上例中 字典键a 的值是列表 (上例中的tmp1的键a),python不会在copy之后的对象中(上例中的tmp1)重新存储,而是用引用的方式,指向原来的值

一句话就是:不会拷贝对象的内部的子对象。而是用引用的方式,指向原来的值


深拷贝:deepcopy()

注意:使用深拷贝函数deepcopy()需要导入模块:import copy

第一步:进行深拷贝

第二步:利用remove()函数把字典tmp1的键'a'的值中的2给移除出去。

第三步:查看tmp的内容

结论:很明显,tmp没有发生任何改变。

以上所谓浅拷贝和深拷贝。希望对你有所帮助。

如果有错误,欢迎指正。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值