3

文档

注意保留对框架对象的引用,如这些函数返回的框架记录的第一个元素中所示,可能会导致您的程序创建引用循环。一旦创建了引用循环,即使启用了 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()吗?还有其他方法/情况吗?

4

0 回答 0