删除Python标准库中的变量

时间:2013-02-14 09:12:53

标签: python reference try-catch

我一直在阅读标准线程库(Python 2.6)中的一些代码,并且有一段代码让我感到奇怪。它可以缩短到以下结构(与 threading.py 中的__bootstrap_inner方法相比):

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范围之外。有没有理由在最后删除这些引用?

1 个答案:

答案 0 :(得分:8)

是的,至少是exc_tb; traceback对象保存对当前帧的引用,这使得它成为循环引用。

通过删除本地引用,您可以打破该圈子,因此您不必希望并相信垃圾收集器能够。

来自sys.exc_info() function docs

  

警告:将回溯返回值分配给处理异常的函数中的局部变量将导致循环引用。这将阻止同一函数中的局部变量或回溯引用的任何内容被垃圾回收。由于大多数函数不需要访问回溯,因此最好的解决方案是使用exctype, value = sys.exc_info()[:2]之类的东西来仅提取异常类型和值。如果确实需要回溯,请确保在使用后删除它(最好使用try ... finally语句)或在本身不处理的函数中调用exc_info()例外。