考慮下面的示例代碼在第二次初始化一個對象時,爲什麼__init__在__del__之前被調用?
class A:
def __init__(self, i):
self.i = i
print("Initializing object {}".format(self.i))
def __del__(self):
print("Deleting object {}".format(self.i))
for i in [1, 2]:
a = A(i)
創建對象中的循環是爲了確保將要創建的新的目的之前,A的析構函數被調用。但顯然會發生以下情況:
初始化對象1
初始化對象2
刪除對象1
刪除對象2
爲什麼對象1的析構函數只新對象初始化後調用?這是一種預期的行爲嗎?我知道for循環在Python中沒有自己的作用域。例如,在C++中,1的析構函數肯定會在對象2的構造函數之前被調用(至少如果對象是在循環中聲明的)。
在我的程序中,我想確保在創建新對象之前刪除舊對象。除了在for循環結束時顯式刪除a
之外,是否還有其他可能性?
在此先感謝。
如果將循環更改爲超過'[1,2,3]',則會發生有趣的事情。 – kennytm 2011-04-18 12:38:23
這將是一個很好的面試問題。 – pajton 2011-04-18 12:39:02
回覆最後一段:你不想那樣做。因爲你不能(GC是非確定性的,而refcounting是一個實現細節),並且你不需要。如果您有資源需要處理,請使用上下文管理器('with'語句)或添加一個像.close()這樣的方法,並確保調用它。 – delnan 2011-04-18 13:08:00