学习笔记,有错必纠
python代码
一上来,我们先看一段python代码:
# -*- coding: utf-8 -*-import copy
class Bunny():
pass
class Dog():
pass
print(Bunny)
huang = Bunny()
print(huang)
huang.age = 10
ha = Dog()
ha.age = 15
ha.friend = huang
hashiqi = 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)
输出结果:
<class '__main__.Bunny'><__main__.Bunny object at 0x000000079FD830F0>
15 15
ha is hashiqi? False
ha's friend is hashiqi's friend? True
15 15
ha is shiqi? False
ha's friend is shiqi's friend? False
好了,不知道大家有没有看明白,现在我们通过对代码和结果进行解释,来学习几个关于类和深浅拷贝的知识点。
自定义类
在上面的代码中,我们创建了Bunny类和Dog类,并打印了Bunny类(print(Bunny))得到结果<class '__main__.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
这就是深拷贝,它不但复制了对象,还复制了对象中引用的对象,甚至是对象引用的对象的对象,以此类推。