1 回答
TA贡献1998条经验 获得超6个赞
没有理由该deepcopy技术对您来说无法解决递归问题。
我认为您可能会遗漏的是deepcopy的备注基于id值的。你只需要包含捕捞对象本身,相同的,而不是对象包含平等的,但不同的对象。毕竟,您不能拥有无穷无尽但相等的对象的深度;那将需要无限的记忆。
事实上,你可以比这更简单deepcopy和pickle,因为它并没有真正的问题是什么,你返回重复的对象,只要它是可哈希的和独特的。1个
因此,例如:
def hashable(obj, *, memo=None):
if memo is None:
memo = set()
if id(obj) in memo:
return (..., id(obj))
memo.add(id(obj))
try:
hash(obj)
return obj
except TypeError:
if isinstance(obj, (list, tuple)):
return tuple(ForcedHashable.hashable(o, memo=memo) for o in obj)
elif isinstance(obj, set):
return frozenset(ForcedHashable(o, memo=memo) for o in obj)
elif isinstance(obj, dict):
return frozenset((k, ForcedHashable.hashable(v, memo=memo)) for k, v in obj.items())
raise
现在:
>>> x = []
>>> x.append(x)
>>> ForcedHashable.hashable(x)
((Ellipsis, 4658316360),)
>>> d = MutableKeyDict()
>>> d[x] = d
>>> d[x]
{<__main__.ForcedHashable object at 0x115855240>: 2, <__main__.ForcedHashable object at 0x115a247f0>: {...}}
在执行此操作时,请执行以下操作:
elif isinstance(obj, (dict, MutableKeyDict)):
return frozenset((k, ForcedHashable.hashable(v, memo=memo)) for k, v in obj.items())
… 现在:
>>> d = MutableKeyDict()
>>> d[d] = d
>>> d
{<__main__.ForcedHashable object at 0x11584b320>: {...}}
1.除非您希望它们像Quine原子一样工作,否则您希望它可以被散列并由相同类型的所有其他Quine原子共享,这是一样容易的。
添加回答
举报