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