Python(三十二)python类的浅拷贝与深拷贝

47 阅读3分钟

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的深拷贝与浅拷贝。建议还是自己尝试一下。

 

有好的建议,请在下方输入你的评论。