【Python面试②】——Python中的浅拷贝与和深拷贝

文章目录

  • python中如何拷贝一个对象
  • 1.变量的赋值操作
  • 2.浅拷贝
  • 3.深拷贝
  • 4.总结
  • python中如何拷贝一个对象

    1.变量的赋值操作

    只是多生成了一个变量,实际上还是指向同一个对象

    # -*- coding: utf-8 -*-
    # author : Flyme awei 
    # 开发时间: 2022/7/1 15:32
    
    class CPU:
        pass
    
    
    class Disk:
        pass
    
    
    class Computer:
        def __init__(self, cpu, disk):  # 给对象的实例属性进行初始化
            self.cpu = cpu
            self.disk = disk
    
    
    # 变量的赋值
    cp1 = Computer(cpu='CPU', disk='DISK')  # 创建CPU类的实例对象
    cp2 = cp1  
    # 变量的赋值,一个对象的实例采用两个变量存储,实际上还是指向一个对象
    print(cp1, id(cp1))
    print(cp2, id(cp2))
    
    

    赋值(=),就是创建了对象的一个新的引用,修改其中任意一个变量都会影响到另一个。


    2.浅拷贝

    Python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象

    # -*- coding: utf-8 -*-
    # author : Flyme awei 
    # 开发时间: 2022/7/1 15:32
    
    import copy
    
    
    class CPU:
        pass
    
    
    class Disk:
        pass
    
    
    class Computer:
        def __init__(self, cpu, disk):  # 给对象的实例属性进行初始化
            self.cpu = cpu
            self.disk = disk
    
    
    cpu = CPU()  # 创建一个 CPU 类的实例对象
    disk = Disk()  # 创建一个Disk 类对象
    computer = Computer(cpu, disk)  # 创建一个Computer类的实例对象
    
    # 浅拷贝
    print(cpu)
    print(disk)
    computer2 = copy.copy(computer)  # 子对象不拷贝
    print(computer, computer.cpu, computer.disk)
    print(computer2, computer2.cpu, computer2.disk)
    
    
    # 类的浅拷贝:
    # Python的拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝
    # 因此,源对象与拷贝对象会引用同一个子对象
    

    浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用
    (如果用引用的方式修改其中一个对象,另外一个也会修改改变)

    哪些是浅拷贝:
    {1,完全切片方法;2,工厂函数,如list();3,copy模块的copy()函数}


    3.深拷贝

    使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同

    # -*- coding: utf-8 -*-
    # author : Flyme awei 
    # 开发时间: 2022/7/1 15:32
    
    import copy
    
    
    class CPU:
        pass
    
    
    class Disk:
        pass
    
    
    class Computer:
        def __init__(self, cpu, disk):  # 给对象的实例属性进行初始化
            self.cpu = cpu
            self.disk = disk
    
    
    cpu = CPU()  # 创建一个 CPU 对象
    disk = Disk()  # 创建一个硬盘类对象
    computer = Computer(cpu, disk)  # 创建一个计算机类对象
    
    # 深拷贝
    computer1 = copy.deepcopy(computer)
    print(computer, computer.cpu, computer.disk)
    print(computer1, computer1.cpu, computer1.disk)
    
    # 类的深拷贝
    # 使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象
    # 源对象和拷贝对象所有的子对象也不同
    

    深拷贝:创建一个新的对象,并且递归的复制它所包含的对象。

    修改其中一个,另外一个不会改变。因此,新对象和原对象没有任何关联。
    例如:{copy模块的deepcopy()函数}


    4.总结

    最直观的理解就是:

    1.浅拷贝,拷贝的程度浅,只拷贝原数据的首地址,然后通过原数据的首地址,去获取内容。

    2.深拷贝,拷贝的程度深,自己新开辟了一块内存,将被拷贝内容全部拷贝过来了;

    来源:Flyme awei

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Python面试②】——Python中的浅拷贝与和深拷贝

    发表评论