Python中的垃圾回收与del语句

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

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

a = 100
b = a
del a
print(b)
print(a)

100
NameError: name 'a' is not defined

在函数和类中若是传递参数的时候,颇有可能参数会作一些改变,一下为一个经典的坑:app

    

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

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

相关文章
相关标签/搜索