• 类的浅拷贝与深拷贝


    变量的赋值操作:

    • 只是形成两个变量,实际上还是指向同一个对象
    #变量的赋值操作
    a=10
    b=10
    print(id(a)) #1775575198288
    print(id(b)) #1775575198288
    
    class CPU:
        pass
    class Disk:
        pass
    class Computer(CPU,Disk):
        def __init__(self,cpu,disk):
            self.cpu=cpu
            self.disk=disk
    
    #变量的赋值
    cpu1=CPU()
    cpu2=cpu1
    #可以发现,两个变量存储的id值都一样,都是指向那个变量
    print(cpu1,id(cpu1))#1965582204880
    print(cpu2,id(cpu2))#1965582204880
    
    运算结果:
    
    1965576579664
    1965576579664
    <__main__.CPU object at 0x000001C9A5D43FD0> 1965582204880
    <__main__.CPU object at 0x000001C9A5D43FD0> 1965582204880

    浅拷贝:

    • python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝。因此,源对象与拷贝对象会引起同一个子对象
    • python的拷贝如果没有特殊说明,都是浅拷贝
    #类的浅拷贝
    print('__________________浅拷贝___________________')
    disk=Disk()
    print(id(disk))
    computer=Computer(cpu1,disk)
    #浅拷贝
    import  copy
    computer2=copy.copy(computer)
    print(computer,computer.cpu,computer.disk)
    print(computer2,computer2.cpu,computer2.disk)
    
    运算结果:
    
    __________________浅拷贝___________________
    2210778671712
    <__main__.Computer object at 0x00000202BCAD6940> <__main__.CPU object at 0x00000202BCAD6FD0> <__main__.Disk object at 0x00000202BCAD6A60>
    <__main__.Computer object at 0x00000202BCAD6850> <__main__.CPU object at 0x00000202BCAD6FD0> <__main__.Disk object at 0x00000202BCAD6A60>
    
    #可以发现,在该运算结果中,只有computer和computer2的id值不同,其他子对象是一样的,也就是说子对象在内存中仅有一份

    深拷贝:

    • 使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同
    #类的深拷贝
    print('__________________深拷贝_____________________')
    computer3=copy.deepcopy(computer)
    print(computer,computer.cpu,computer.disk)
    print(computer3,computer3.cpu,computer3.disk)
    
    运行结果:
    
    __________________深拷贝_____________________
    <__main__.Computer object at 0x0000024E2E1E6940> <__main__.CPU object at 0x0000024E2E1E6FD0> <__main__.Disk object at 0x0000024E2E1E6A60>
    <__main__.Computer object at 0x0000024E2E1E6760> <__main__.CPU object at 0x0000024E2E1E63D0> <__main__.Disk object at 0x0000024E2E1E6370>
    
    可以发现不仅仅computer和computer3的id不同,他们的子对象的id也都不同(disk/cpu)。也就是说,深拷贝不仅仅复制了一份computer的实例对象,还拷贝了源对象的所有子对象
    

      

  • 相关阅读:
    [poj解题]1017
    [算法] aov图拓扑算法
    【supervisord】部署单进程服务的利器
    【python】一个备份把文件备份到邮箱的python实现
    【GO】关于GO的浅显总结
    iOS开发快捷键
    iOS开发笔记
    VS2012智能提示无效解决方案
    国内几个WindowPhone广告平台
    纪念自己的第四个App:秘密Secret
  • 原文地址:https://www.cnblogs.com/xiaoqing-ing/p/14998589.html
Copyright © 2020-2023  润新知