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']。

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

 

 

posted @ 2019-02-28 21:25  脱离低级趣味  阅读(315)  评论(0编辑  收藏  举报