Python中的对象复制,深拷贝与浅拷贝
一:直接赋值
直接赋值: 其实就是对象的引用(别名)。
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))
输出:
lua
复制代码
直接赋值------------------------------ Cpu1地址为: 2787239672904 Cpu2地址为: 2787239672904
变量Cpu1 和 Cpu2的对象id是相同的,因此,Cpu2就是Cpu1的引用。
我们来简单的验证一下:
scss
复制代码
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方法,我们来修改一下上边的代码
python
复制代码
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))
输出:
lua
复制代码
浅拷贝------------------------------ 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方法,我们来修改一下上边的代码
声明类的代码不变,这里修改一下拷贝的代码
bash
复制代码
# 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))
输出:
lua
复制代码
深拷贝------------------------------ Cpu1地址为: 2529781644744 Cpu4地址为: 2529781590856 Cpu1.disk的地址为: 2529781645064 Cpu4.disk的地址为: 2529781588040 Cpu1.count的地址为: 140726047580592 Cpu4.count的地址为: 140726047580560
深拷贝就是所有的变量都重新拷贝了一份。
以上大概就是python的深拷贝与浅拷贝。建议还是自己尝试一下。
有好的建议,请在下方输入你的评论。