如何在字典中检查循环/反向边?{...}

6

如何检测字典中是否存在可能导致无限循环或引起最大递归深度异常的后向边(也称为后向引用)。

x = {'a':1}           
x['b'] = x            #referencing same dict, creating back edge
print(x)
>{'a': 1, 'b': {...}}

显然,Python聪明到足以找出背向边并通过将它们打印为{...}来标记它们。有没有一种方法可以访问这些信息,以便可以跳过它们,而无需检查所有元素的id是否相同?

1个回答

7
dict.__repr__的实现调用Py_ReprEnter,它是reprlib.recursive_repr的C API类似物,记录当前线程正在计算字典的repr。如果在没有中间Py_ReprLeave的情况下再次输入该字典的dict.__repr__,Python就知道它处于递归的repr调用中,并使用'{...}'而不是经过常规逻辑。
您可以在自己的代码中应用类似的技术。在您想要编写的任何递归遍历中,记录当前线程当前正在处理的对象,并使用该信息检测何时命中循环。根据您尝试做什么以及输入结构,可能有其他有用的技术。

此外,对于感兴趣的人,代码实现在这里 - cs95

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接