例如,在代碼中:
a = [1, 2, 3, 4] # huge list
y = sum(a)
print( do_stuff(y) )
a在程式結束之前,串列的記憶體是否會被釋放?do_stuff函式呼叫是否必須通過不斷占用記憶體來完成所有a作業,即使永遠a不會再次使用?
如果a沒有得到垃圾收集,a=None一旦我完成使用它,是手動設定的解決方案嗎?
uj5u.com熱心網友回復:
想象一下do_stuff這樣做:
def do_stuff(y):
return globals()[input()]
并且用戶輸入a,所以串列最終在那里使用。Python 無法知道這不會發生,它必須讀懂用戶的想法。
考慮這樣一個簡單的案例:
def do_stuff(y):
return y
現在很明顯它a不再被使用了,所以 Python可以解決這個問題嗎?嗯......print不再是關鍵字/陳述句。Python 必須弄清楚你沒有print用確實使用的東西覆寫a. 即使你沒有,它也需要知道它自己print不使用a.
你必須自己洗掉它。我會用del a. (除非你想 a仍然存在并擁有價值None)。
uj5u.com熱心網友回復:
a除非它超出范圍(即它在開始的函式中),否則永遠不會被釋放,或者您手動將其設定為None.
Python 的垃圾收集器使用一個稱為參考計數的系統。簡而言之,所有變數都有一個參考計數器,該計數器在創建對變數的參考時遞增,并在變數設定為None或超出范圍時遞減。
例子:
a = [999999] # 1 reference, the value [999999] is stored in memory
b = a # 2 references
def foo(x):
print(x)
foo(a) # 3 references during the function call
# back to 2 references
a = None # 1 reference
b = None # 0 references, the value [999999] is deleted from memory
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/493900.html
標籤:Python python-3.x 记忆 范围 垃圾收集
上一篇:計算MySQL中的唯一組合
下一篇:來自派生類實體的Pickle基類
