1 回答

TA貢獻(xiàn)1998條經(jīng)驗(yàn) 獲得超6個(gè)贊
沒(méi)有理由該deepcopy技術(shù)對(duì)您來(lái)說(shuō)無(wú)法解決遞歸問(wèn)題。
我認(rèn)為您可能會(huì)遺漏的是deepcopy的備注基于id值的。你只需要包含捕撈對(duì)象本身,相同的,而不是對(duì)象包含平等的,但不同的對(duì)象。畢竟,您不能擁有無(wú)窮無(wú)盡但相等的對(duì)象的深度;那將需要無(wú)限的記憶。
事實(shí)上,你可以比這更簡(jiǎn)單deepcopy和pickle,因?yàn)樗](méi)有真正的問(wèn)題是什么,你返回重復(fù)的對(duì)象,只要它是可哈希的和獨(dú)特的。1個(gè)
因此,例如:
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
現(xiàn)在:
>>> 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>: {...}}
在執(zhí)行此操作時(shí),請(qǐng)執(zhí)行以下操作:
elif isinstance(obj, (dict, MutableKeyDict)):
return frozenset((k, ForcedHashable.hashable(v, memo=memo)) for k, v in obj.items())
… 現(xiàn)在:
>>> d = MutableKeyDict()
>>> d[d] = d
>>> d
{<__main__.ForcedHashable object at 0x11584b320>: {...}}
1.除非您希望它們像Quine原子一樣工作,否則您希望它可以被散列并由相同類(lèi)型的所有其他Quine原子共享,這是一樣容易的。
添加回答
舉報(bào)