Python中的对象复制,深拷贝与浅拷贝
一:直接赋值
直接赋值: 其实就是对象的引用(别名)。
class Cpu(object):
count = 0
disk = ''
def __init__(self,disk):
self.count += 1
self.disk = disk
def useCpu(self):
self.count += 1
class Disk(object):
def useDisk(self):
print("使用Disk")
# 直接赋值
print("直接赋值------------------------------")
Cpu1 = Cpu(Disk())
Cpu2 = Cpu1
print("Cpu1地址为:", id(Cpu1))
print("Cpu2地址为:", id(Cpu2))
输出:
直接赋值------------------------------
Cpu1地址为: 2787239672904
Cpu2地址为: 2787239672904
变量Cpu1 和 Cpu2的对象id是相同的,因此,Cpu2就是Cpu1的引用。
我们来简单的验证一下:
Cpu1.useCpu()
print("cpu1中的count值为:", Cpu1.count)
print("cpu2中的count值为:", Cpu2.count)
输出:
cpu1中的count值为: 2
cpu2中的count值为: 2
我们执行Cpu1对象中的useCpu方法,count加1,值为2
我们输出Cpu2对象中的count属性,值也是2
二:浅拷贝
浅拷贝 (copy) : 拷贝父对象,不会拷贝对象的内部的子对象。
浅拷贝需要使用到python中的 copy模块中的copy方法,我们来修改一下上边的代码
import copy
class Cpu(object):
count = 0
disk = ''
def __init__(self,disk):
self.count += 1
self.disk = disk
def useCpu(self):
self.count += 1
class Disk(object):
def useDisk(self):
print("使用Disk")
# 直接赋值
print("直接赋值------------------------------")
Cpu1 = Cpu(Disk())
print("浅拷贝------------------------------")
Cpu3 = copy.copy(Cpu1)
print("Cpu1地址为:", id(Cpu1))
print("Cpu3地址为:", id(Cpu3))
Cpu1.useCpu()
print("Cpu1.disk的地址为:", id(Cpu1.disk))
print("Cpu3.disk的地址为:", id(Cpu3.disk))
print("Cpu1.count的地址为:", id(Cpu1.count))
print("Cpu3.count的地址为:", id(Cpu3.count))
输出:
浅拷贝------------------------------
Cpu1地址为: 2359483460936
Cpu3地址为: 2359483461512
Cpu1.disk的地址为: 2359483461256
Cpu3.disk的地址为: 2359483461256
Cpu1.count的地址为: 140726589890992
Cpu3.count的地址为: 140726589890960
查看输出结果,我们可以看到,变量Cpu1与Cpu3两个变量的地址是不同的,Cpu1中的count与cpu2中的count是不同的,但是Cpu1中的disk对象与Cpu2中的disk对象的地址是相同的,这个就是我们的浅拷贝。
Python中的拷贝没有特殊说明的时候,默认都指浅拷贝。
三:深拷贝
深拷贝 (deepcopy) : copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
深拷贝需要使用到python中的 copy模块中的deepcopy方法,我们来修改一下上边的代码
声明类的代码不变,这里修改一下拷贝的代码
# print("深拷贝------------------------------")
Cpu4 = copy.deepcopy(Cpu1)
print("Cpu1地址为:", id(Cpu1))
print("Cpu4地址为:", id(Cpu4))
Cpu1.useCpu()
print("Cpu1.disk的地址为:", id(Cpu1.disk))
print("Cpu4.disk的地址为:", id(Cpu4.disk))
print("Cpu1.count的地址为:", id(Cpu1.count))
print("Cpu4.count的地址为:", id(Cpu4.count))
输出:
深拷贝------------------------------
Cpu1地址为: 2529781644744
Cpu4地址为: 2529781590856
Cpu1.disk的地址为: 2529781645064
Cpu4.disk的地址为: 2529781588040
Cpu1.count的地址为: 140726047580592
Cpu4.count的地址为: 140726047580560
深拷贝就是所有的变量都重新拷贝了一份。
以上大概就是python的深拷贝与浅拷贝。建议还是自己尝试一下。
有好的建议,请在下方输入你的评论。