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