簡體   English   中英

解釋器關閉時對象會發生什么

[英]What happens to objects when interpreter shuts down

當Python解釋器關閉時,我有點困惑對象發生了什么。 如果我這樣寫一點代碼

class MyClass(object):
    def __del__(self):
        print "I'm going away"

o = MyClass()

並運行它,我會得到這個

I'm going away

我的理解是,當解釋器關閉時,它將刪除對創建對象的所有引用,並且如果指定,這些對象將運行__del__() (因為它們的引用計數為0)。

我的困惑是因為:

  1. 我找不到任何說明python將在退出時清除所有引用的文檔。
  2. 我很困惑為什么當內存將要返回到操作系統並無論如何都聲明為空閑時會清理對象。 我猜想在復雜的系統中刪除內存中的對象將付出巨大的代價,而這些對象無論如何都將是免費的。
  3. 閱讀有關__del__()文檔時,我看到了It is not guaranteed that __del__() methods are called for objects that still exist when the interpreter exits. 而且它變得更加復雜了,他們是說由於某些周期依賴性而不能保證運行它還是只是保證了它不能運行? 誰來決定?

所以我的問題是:

  1. 在上面的示例中誰叫__del__
  2. 為什么沒有參考周期時不能guaranteed調用它

我沒有看到的第一個問題點,但CPython的2.7.8, __del__被稱為PyInstanceObject.instance_dealloc ,這是注冊為tp_dealloc ,當它被稱為Py_DECREF被稱為和引用計數為零。 因此,我們只說解釋器調用了它,而不是Python代碼。 如果您問這個問題是希望您可以更改調用方式或調用時間,那么我認為這是不可能的。

至於為什么不能保證,要做到這一點,您必須在退出之前檢查所有模塊,刪除它們的變量,但是如果__del__方法依賴於任何全局變量,則沒有簡單的方法來保證執行它們的安全順序。 我並不是說這是不可能的,就像參考循環一樣,我是說它很復雜。

我想這是在某個時候討論過的,但是社區或BDFL認為這不值得麻煩。 我相信我在幾年前看到了一些討論,但現在找不到。 首先,從不鼓勵使用__del__方法,如果需要確保調用某些析構函數方法,則最好使用上下文管理器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM