Python 使用了引用計數這一簡單技術來跟蹤和回收垃圾。
在 Python 內部記錄着所有使用中的對象各有多少引用。
一個內部跟蹤變量,稱為一個引用計數器。
當對象被創建時, 就創建了一個引用計數, 當這個對象不再需要時, 也就是說, 這個對象的引用計數變為0 時, 它被垃圾回收。但是回收不是"立即"的, 由解釋器在適當的時機,將垃圾對象占用的內存空間回收。
a = 40 # 創建對象 <40> b = a # 增加引用, <40> 的計數 c = [b] # 增加引用. <40> 的計數 del a # 減少引用 <40> 的計數 b = 100 # 減少引用 <40> 的計數 c[0] = -1 # 減少引用 <40> 的計數
垃圾回收機制不僅針對引用計數為0的對象,同樣也可以處理循環引用的情況。循環引用指的是,兩個對象相互引用,但是沒有其他變量引用他們。這種情況下,僅使用引用計數是不夠的。Python 的垃圾收集器實際上是一個引用計數器和一個循環垃圾收集器。作為引用計數的補充, 垃圾收集器也會留心被分配的總量很大(及未通過引用計數銷毀的那些)的對象。 在這種情況下, 解釋器會暫停下來, 試圖清理所有未引用的循環。
實例
析構函數 __del__ ,__del__在對象銷毀的時候被調用,當對象不再被使用時,__del__方法運行:
實例
#!/usr/bin/python
# -*- coding: UTF-8 -*-
class Point:
def __init__( self, x=0, y=0):
self.x = x
self.y = y
def __del__(self):
class_name = self.__class__.__name__
print class_name, "銷毀"
pt1 = Point()
pt2 = pt1
pt3 = pt1
print id(pt1), id(pt2), id(pt3) # 打印對象的id
del pt1
del pt2
del pt3
# -*- coding: UTF-8 -*-
class Point:
def __init__( self, x=0, y=0):
self.x = x
self.y = y
def __del__(self):
class_name = self.__class__.__name__
print class_name, "銷毀"
pt1 = Point()
pt2 = pt1
pt3 = pt1
print id(pt1), id(pt2), id(pt3) # 打印對象的id
del pt1
del pt2
del pt3
以上實例運行結果如下:
3083401324 3083401324 3083401324 Point 銷毀