2015-12-27 86 views
2

說有函數完成時,對象是否從內存中刪除了對象? Python的

class thing(object): 
    def __init__(self): 
     self.text = "foo" 


def bar(): 
    obj = thing() 
    #do something with the object 

bar() 

從內存條後(OBJ刪除)完成,或者是它仍然在內存中,只是不能被訪問,因爲它是酒吧的一個局部變量? (當然,這假定obj不會放入全局或外部容器,例如字典或列表中)。

+0

「已刪除」和「符合刪除條件」之間的區別是非常存在的。無論活動語言的實現如何,只要函數完成,這些對象就有資格被刪除;它們是否實際上被立即刪除(或者當GC被週期性觸發時被刪除)取決於你正在運行的是哪個解釋器。 –

回答

2

當函數退出時,對象obj引用將被刪除。

這是因爲CPython(默認的Python實現)使用引用計數來跟蹤對象的生命週期。 obj是一個局部變量,只存在於函數的持續時間內。 thing()是一個只有一個參考的實例,obj,並且obj被清除時,引用計數將降爲0,並立即刪除thing()

如果您使用PyPy,IronPython,Jython或其他實現,由於實現可以自由使用不同的垃圾收集方案,因此可能會延遲對象銷燬。這隻對執行__del__方法很重要,因爲它們的調用可能會延遲。

如果您想更多地瞭解Python名稱的工作原理,我建議您閱讀優秀的Facts and myths about Python names and values

-1

摻入更正:

是的,爲0的引用計數對象時的功能超出範圍被回收。

Python已經構建了全局(模塊)範圍和函數範圍。

如果您有一個資源需要在範圍退出後立即釋放,請將其放入with塊中,並將邏輯釋放資源__exit__。與with塊相關的變量仍然是封閉函數或模塊的本地變量。

一旦它們超出範圍就應該釋放的資源的成語是with,例如,

with open("frodo.txt","r") as fh: 
    for line in fh: 
     do_something(line) 

在CPython的,之前的3.4版本,使用自定義__del__方法的對象可能是一個不確定的順序,如果他們參與了週期刪除。

+0

'fh'沒有被清理,只是因爲'with'塊已退出。只是,'fh .__ exit __()'保證被調用。 '帶'塊不是一個新的範圍。 –

+0

OP陳述的例子沒有循環,循環檢測算法沒有涉及。 –

+0

最後但並非最不重要的一點,CPython *確實具有確定性破壞,對於沒有涉及週期的任何對象。即使那些參與循環的人通常也會以確定性的方式破壞循環。例外情況是具有'__del__'鉤子的類的實例,並且僅在3.4之前的Python版本中。有關更多詳細信息,請參見['gc'模塊文檔](https://docs.python.org/3/library/gc.html)。 –