zoukankan      html  css  js  c++  java
  • 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']。

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

     

  • 相关阅读:
    RECOVER DATABASE SKIP TABLESPACE
    mysql加解密函数
    node获取代码的svn版本号,并打包的时候,输出指定文件到打包后的项目里面
    layer.open iframe自动高度
    IIS部署.net5项目
    使用Windows命令行启动关闭服务(net,sc用法)(转)
    centos7 修改IP 设置静态IP,开启SSH
    链接PostgreSQL报错authentication method 10 not supported解决
    PostgreSQL Windows安装教程
    POI隐藏行 隐藏列,EasyExcel隐藏行 EasyExcel隐藏列
  • 原文地址:https://www.cnblogs.com/yc3110/p/10453258.html
Copyright © 2011-2022 走看看