6

我一直在阅读标准线程库(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范围。最后有什么理由删除这些引用吗?

4

1 回答 1

8

是的,至少对于exc_tb; 回溯对象持有对当前帧的引用,这使得它成为循环引用。

通过删除本地引用,您打破了这个圈子,因此您不必希望和相信垃圾收集器能够做到。

sys.exc_info()函数文档

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

于 2013-02-14T09:14:03.613 回答