python观察日志(part12)--基于类的深拷贝与浅拷贝

网友投稿 259 2022-08-31


python观察日志(part12)--基于类的深拷贝与浅拷贝

学习笔记,有错必纠

python代码

一上来,我们先看一段python代码:

# -*- coding: utf-8 -*-import copyclass Bunny(): passclass Dog(): passprint(Bunny)huang = Bunny()print(huang)huang.age = 10ha = Dog()ha.age = 15ha.friend = huanghashiqi = copy.copy(ha)print(ha.age, hashiqi.age)print("ha is hashiqi? ", ha is hashiqi)print("ha's friend is hashiqi's friend? ", ha.friend is hashiqi.friend)shiqi = copy.deepcopy(ha)print(ha.age, hashiqi.age)print("ha is shiqi? ", ha is shiqi)print("ha's friend is shiqi's friend? ", ha.friend is shiqi.friend)

输出结果:

<__main__.Bunny object at 0x000000079FD830F0>15 15ha is hashiqi? Falseha's friend is hashiqi's friend? True15 15ha is shiqi? Falseha's friend is shiqi's friend? False

好了,不知道大家有没有看明白,现在我们通过对代码和结果进行解释,来学习几个关于类和深浅拷贝的知识点。

自定义类

在上面的代码中,我们创建了Bunny类和Dog类,并打印了Bunny类(​​print(Bunny)​​​)得到结果​​​​​,从中我们可以看出这个Bunny类的全名其实是​​__main__.Bunny​​

之后,我们创建了一个Bunny对象huang,新建一个对象的过程就叫做实例化,这个对象(huang)这个类(Bunny)的实例。

我们同样打印了对象huang,得到结果​​<__main__.Bunny object at 0x000000079FD830F0>​​​,这个结果告诉我们对象所属的类型​​__main__.Bunny​​​,以及存储在内存中的位置​​0x000000079FD830F0​​

之后,我们创建Dog类的对象ha,对huang和ha的属性age进行赋值,并将huang赋值给ha的属性friend

深浅拷贝

做完上面的一切后,我们就开始拷贝了。

首先,我们利用copy.copy()函数对ha进行浅拷贝,得到hashiqi,我们打印ha和hashiqi的age,发现都是15:

15 15

再比较这俩是不是同一个对象,和他俩的friend是不是同一个对象,发现ha和hashiqi已经不是同一个对象了,但是他俩friend依然还是同一个对象:

ha is hashiqi? Falseha's friend is hashiqi's friend? True

这就是浅拷贝的特点,它并不会复制对象的内嵌对象。

之后,我们又利用 copy.deepcopy()函数对ha进行深拷贝得到shiqi,我们打印ha和shiqi的age,发现依然是15:

15 15

再比较这俩是不是同一个对象,和他俩的friend是不是同一个对象,发现ha和shiqi不是同一个对象,他俩friend也不是同一个对象了:

ha is shiqi? Falseha's friend is shiqi's friend? False

这就是深拷贝,它不但复制了对象,还复制了对象中引用的对象,甚至是对象引用的对象的对象,以此类推。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:springboot ErrorPageFilter的实际应用详解
下一篇:python观察日志(part10)--__future__ 模块
相关文章

 发表评论

暂时没有评论,来抢沙发吧~