Python中的浅拷贝与深拷贝

最近两天一直在学习Scrapy的分布式爬虫技术,因此博客耽搁的几天更新,等把那个课程学完,我会发布那个课程的学习心得。

今天我想谈谈关于Python中的深拷贝和浅拷贝的内容,其实之前在学习前端的时候,JS当中就有深拷贝和浅拷贝的问题,当时学的时候就有点迷迷糊糊,今天想借着这个机会把这个问题搞清楚。

深拷贝和浅拷贝的问题其实还涉及另一个内容,就是赋值,我们就把这三个东西放在一起说。

首先说赋值,python中对一个对象赋值,其实并没有拷贝这个对象,只是拷贝了这个对象的引用,然后赋给另一个对象。

浅拷贝就不同于赋值了,python中如果浅拷贝了一个对象,则实际上是对这个对象的最外围的一层对象进行了拷贝,而对象内部的对象,则是引用而不是拷贝。

深拷贝又不同于浅拷贝,python中深拷贝了一个对象,则是不管外围对象还是内部对象,还是内部对象的内部对象,都进行了拷贝,说白了,就是完全拷贝了一个新对象出来,新对象与原对象没有半毛钱关系。

说了这么多我们还是看例子比较直观,易懂。

  • 我们还是先看赋值

上面的例子可以看到,a赋值给b,其实并没有拷贝a,而是b引用了a而已,而且不光是最外围的a列表引用,连里面的子元素也

进行了引用,这就是赋值的意思。

  • 下面我们来看浅拷贝的情况

上面的例子我们先引入copy这个包,然后用它的copy函数来进行浅拷贝,我们发现,最外围的对象,即对象a列表进行了拷贝,id(a)和id(b)不再相同,但是a和b内部的对象还是一样了。即浅拷贝只是拷贝了最外围了对象,而对象内部的对象还是引用。

  • 最后我们来看深拷贝的例子

这个例子我们发现b深拷贝了a,最外围的对象a列表和b列表发生了拷贝,但是内部的对象,即id(a[0])和id(b[0])还是一样了,

还是引用,和浅拷贝的情况一样了。其实如果大家看过我之前的一篇博客有关可变类型与不可变类型,就知道由于a[0]和b[0]都是

int型,因此他们都是不可变类型,如果值相同,则会指向同一块内存,这是另外一个问题了。我们再举一个深拷贝的例子大家

就清楚了。

我们把a的内部变量也变成可变类型,这样就比较直观了。深拷贝之后,不光最外围的对象a列表和b列表发生了拷贝,内部的

对象id(a[0])和id(b[0])也发生了拷贝,这就是深拷贝的意思。

好了,我们简单总结一下

  • 对于不可变类型的数据,无所谓深拷贝还是浅拷贝,因为即使是深拷贝之后,地址值和原来的也是一样的。
  • 对于可变类型的数据
    • 赋值:没有拷贝,对原对象是引用
    • 浅拷贝:只对最外围的对象进行了拷贝,对内部对象是引用
    • 深拷贝:对整个对象是拷贝,不管是最外围的对象还是对象内部的对象,都是拷贝
好了,以上就是今天的全部内容
与您共勉!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值