通常情況下,python的gc 記憶體回收機制,有一套演算法,可以用來回收循環參考的對象,避免記憶體泄露。
不過,有個例外的情況:顯示重寫了__del__方法。
例子:
#-*- coding: UTF-8 -*-#-------------------------------------------------------------------------------# Name: # Purpose: ## Author: ankier## Created: 28-03-2013# Copyright: (c) ankier 2013# Licence: <your licence>#-------------------------------------------------------------------------------import gcimport timeclass Teacher: def __init__(self): self.Stu = None def __del__(self): print '釋放 Teacher執行個體' class Student: def __init__(self): self.Tea = None def __del__(self): print '釋放 Student執行個體' def MethoTest(): tea = Teacher() stu = Student() #設定循環參考 tea.Stu = stu stu.Tea = tea del tea del stu if __name__ == '__main__': gc.enable() gc.set_debug(gc.DEBUG_COLLECTABLE | gc.DEBUG_UNCOLLECTABLE | \ gc.DEBUG_INSTANCES | gc.DEBUG_OBJECTS) MethoTest() print '開始記憶體回收...' _unreachable = gc.collect() print '無法到達的對象個數: %d' % _unreachable print '記憶體泄露的對象個數:%d' % len(gc.garbage) time.sleep(3) print '程式退出!'
輸出結果:存在循環參考,所在再推出方法MethodTest 後,已經無法回收改2個對象,導致了記憶體泄露。
如果把重寫__del__方法給注釋掉,不主動重寫,則即使存在循環參考,python gc 機制 也能很好的釋放資源。
如結果,所有的資源已經釋放掉了。因此,再python 代碼編寫過程中,建議不要重寫__del__方法,否則,就需要自己去手動釋放帶有循環參考的資源。前者更好的選擇。