• Python中的垃圾回收与del语句


    python中的垃圾回收采用计数算法

    一个对象如果被引用N次,则需要N次(即计算引用次数为零时)执行del 才能回收此对象。

    a = 100
    b = a
    del a
    print(b)
    print(a)
    
    100
    NameError: name 'a' is not defined

    在函数和类中如果传递参数的时候,很有可能参数会做一些改变,一下为一个经典的坑:

        

    def add(a, b):
        a += b
        return a
    a = [1,2]
    b = [3,4]
    c = add(a,b )
    print(b)
    print(a)
    print(c)
    
    [3, 4]
    [1, 2, 3, 4]
    [1, 2, 3, 4]
    在传递为可变对象list时候,函数内部可以对全局变量引用并改变。但是如果传递参数为不可变对象时,原参数就不会发生改变。
    
    class Company():
        def __init__(self, name, staffs=[]):
            self.name = name
            self.staffs = staffs
        def add(self, staff_name):
            self.staffs.append(staff_name)
        def remove(self, staff_name):
            self.staffs.remove(staff_name)
    if __name__ == '__main__':
        com1 = Company('company1', ['bobby1', 'bobby2'])
        com1.add('bobby3')
        com1.remove('bobby1')
        print(com1.staffs)
    
        com2 = Company('company2')
        com2.add('bobby')
        print(com2.staffs)
        print(Company.__init__.__defaults__)
    
        com3 = Company('company3')
        com3.add('bobby5')
        print(com2.staffs) 
        print(com3.staffs)
        print(com2.staffs is com3.staffs)
    
    ['bobby2', 'bobby3']
    ['bobby']
    (['bobby'],)
    ['bobby', 'bobby5']
    ['bobby', 'bobby5']
    True

    代码解释:在因为com2没有指定list参数于是调用的默认参数。默认参数可以用print(Company.__init__.__defaults__)打印出来看到,当执行com2.add('bobby')之后,可以看到Campany类的默认参数已经变成了(['bobby'],),于是后面的com3在实例化的时候,由于没有带list参数,就会指向默认参数,即['bobby']。

    总结:在函数或类方法中要尽量避免传递可变的类型参数。

     

  • 相关阅读:
    NSubstitute完全手册索引
    EntityFramework用法探索(二)CodeFirst
    NSubstitute完全手册(十八)检查调用顺序
    单元测试的两种方式
    C#使用Emit构造拦截器动态代理类
    使用Unity进行AOP对象拦截
    C#使用Emit生成构造函数和属性
    AFTER THE AMM, DECENTRALIZED ORDER BOOK EXCHANGES ARE RISING!
    常用Defi工具与网站
    揭秘FPGA:为什么比 GPU 的延迟低这么多?
  • 原文地址:https://www.cnblogs.com/yc3110/p/10453258.html
Copyright © 2020-2023  润新知