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

相關文章
相關標籤/搜索