def remove_circular_refs(ob, _seen=None):
if _seen is None:
_seen = set()
if id(ob) in _seen:
# circular reference, remove it.
return None
_seen.add(id(ob))
res = ob
if isinstance(ob, dict):
res = {
remove_circular_refs(k, _seen): remove_circular_refs(v, _seen)
for k, v in ob.items()}
elif isinstance(ob, (list, tuple, set, frozenset)):
res = type(ob)(remove_circular_refs(v, _seen) for v in ob)
# remove id again; only *nested* references count
_seen.remove(id(ob))
return res
不要使用字符串转换,不。只需通过遍历数据结构来检测引用:
这包括
dict
、list
、tuple
、set
和frozenset
对象;它记录所看到的每个对象的id()
,当它再次被看到时,它被替换为None
。在演示:
^{pr2}$最后一个测试}在内存中只存在一次,字典包含对这些对象的多个引用。在
doc3
,包含共享引用;'string 1'
和{相关问题 更多 >
编程相关推荐