2013-02-14 62 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