• 流畅的Python——比较对对象的潜复制和深复制


    比较copy和deepcopy的不同

    👇创建一个Bus类,并创建三个Bus对象,分别用到了潜复制和深复制,比较二者的不同。

    class Bus:
        def __init__(self, passengers=None):
            if passengers is None: #is通常用来判断对象是否为None,它的运算速度比 == 快,因为它是不可重载的
                self.passengers = []
            else:
                self.passengers = list(passengers)
        
        def pick(self, name):
            self.passengers.append(name)
        
        def drop(self, name):
            self.passengers.remove(name)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    👆注:python用==比较值,用is比较引用。
    👇创建三个对象,用到了copy模块中的copy和deepcopy。

    import copy
    bus1 = Bus(['Alice', 'Bill', 'Clarie', 'David'])
    bus2 = copy.copy(bus1)
    bus3 = copy.deepcopy(bus1)
    id(bus1), id(bus2), id(bus3)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    👇比较结果
    在这里插入图片描述
    可见,深复制是构造了新的列表,而潜复制是对原来列表进行了引用。

    最好不要将默认参数设为可变类型

    注意,最好不要将默认参数设为可变类型,如,上面类定义中的passengers参数,默认参数为None,但是不要定义为[](即,默认创建一个空列表),因为这样做会使所有类对象共享同一个列表。

    在类定义中使用列表赋值时,创建新的副本,而不要直接赋值

    在类定义中,如果passengers不为None,则通过self.passengers = list(passengers)创建一个list副本。如果不这样做,若passengers传进来的也是一个可变对象(如,一个列表),那么会将这个列表的引用赋值给self.passengers,导致对self.passengers进行修改时,原来的外部可变对象也被修改,这显然是不合理的。

  • 相关阅读:
    四种自动化测试模型实例及优缺点
    攻防世界津门杯2021-m1
    pytorch中transform.Compose()用法
    使用dispatchEvent解决重叠元素响应事件问题
    1780_添加鼠标右键空白打开命令窗功能
    UPC2022暑期个人训练赛第19场(B,P)
    网关 GateWay 的使用详解、路由、过滤器、跨域配置
    pwn学习(2)test_your_nc
    StatefulSet 简单实践 Kubernetes
    Leetcode137. 某一个数字出现一次,其余数字出现3次
  • 原文地址:https://blog.csdn.net/fatfairyyy/article/details/126803146