文档says:
注意在这些函数返回的框架记录的第一个元素中找到对框架对象的引用,可能会导致您的程序创建引用循环。创建参考周期后,即使启用了Python的可选周期检测器,可以从构成周期的对象中访问的所有对象的寿命也会变得更长。如果必须创建这样的循环,则重要的是要确保明确地将其破坏,以避免延迟破坏对象和增加内存消耗。
尽管周期检测器将捕获这些,但可以通过删除
finally
子句中的周期来确定是否破坏了帧(和局部变量)。如果在编译Python或使用gc.disable()
时禁用了循环检测器,这也很重要。例如:def handle_stackframe_without_leak(): frame = inspect.currentframe() try: # do something with the frame finally: del frame
如果您希望保留框架(例如稍后打印回溯),还可以使用
frame.clear()
方法来中断参考循环。
据说这意味着有两件事相互引用。他们到底是什么?
您能否更准确地解释在什么条件下创建参考循环?我何时在没有inspect.currentframe()
的情况下做del frame
? inspect.stack()
也一样吗?还有其他方法/情况吗?