删除Python标准库中的变量

fre*_*ish 6 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
Run Code Online (Sandbox Code Playgroud)

这些变量不在foo范围之外.有没有理由在最后删除这些引用?

Mar*_*ers 8

是的,至少是exc_tb; traceback对象包含对当前帧的引用,这使得它成为循环引用.

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

sys.exc_info()功能文档:

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