2013-02-14 64 views
6

我一直在閱讀標準線程庫(Python 2.6)中的一些代碼,並且有一段代碼讓我感到驚訝。它可以縮短到下面的結構(比較__bootstrap_inner方法threading.py):刪除Python標準庫中的變量

def foo(): 
    exc_type, exc_value, exc_tb = sys.exc_info() 
    try: 
     # some code 
    except: 
     # some code 
    finally: 
     del exc_type, exc_value, exc_tb 

這些變量不走的foo範圍之內。是否有理由在最後刪除這些引用?

回答

8

是的,至少對於exc_tb;追蹤對象持有對當前幀的引用,並且使其成爲循環引用。

通過刪除本地引用你打破了這個圈子,所以你不必指望垃圾收集器能夠。

sys.exc_info() function docs

警告:在被處理異常將導致循環引用的功能分配回溯返回值的局部變量。這將防止在同一個函數中由局部變量引用的任何東西,或者通過垃圾收集回溯。由於大多數函數不需要訪問回溯,所以最好的解決方案是使用類似於exctype, value = sys.exc_info()[:2]的東西來僅提取異常類型和值。如果確實需要回溯,請確保在使用後刪除它(最好使用try ... finally聲明)或者在不處理異常的函數中調用exc_info()

+0

啊,我明白了。不知何故,我錯過了文檔。謝謝! – freakish 2013-02-14 09:16:51