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']。
总结:在函数或类方法中要尽量避免传递可变的类型参数。