我应该在传递给我的用户定义的deepcopy函数的visit dict中输入什么?

2024-05-29 02:57:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要为我的一个类定义自己的deepcopy函数。documentation表示函数__deepcopy__()被传递一个备忘录字典,用于跟踪哪些对象已经被复制,以避免在处理递归对象时被捕获。然而,它没有说什么放在字典里。我是把对象放进去,还是对象ID?你怎么用它?我找不到任何网站来解释它,除了this一本书说它不需要被使用,除了把它传递给__deepcopy__的其他调用。你知道吗

谢谢


Tags: 对象函数id字典定义网站documentationthis
2条回答

为了与内置的copy.deepcopy行为保持一致,应该使用对象的id作为键。你知道吗

更多详情:

虽然通常可以使用不同的密钥方案(例如对象本身,如果它是可哈希的),但只要保持一致,仍然会遇到麻烦。通常__deepcopy__是通过对某些包含的属性调用copy.deepcopy来实现的。如果直接向memo添加项,您必须确定键不会与copy.deepcopy添加的项冲突,后者添加由id生成的键,这些键是整数。你知道吗

因此,如果使用不同的密钥方案,例如直接将对象用作密钥,则不能添加任何整数对象。你知道吗

底线:

只使用id要容易得多,而且不必担心上面的异常。你知道吗

回答我自己的问题,感谢@Jon Eric:

我从http://www.doughellmann.com/PyMOTW/copy/所示的示例中了解到,您使用self作为键,使用复制的对象作为值。然后,当再次尝试复制这个对象(self)时,可以检查memo字典以查看它是否已经被复制,并返回对副本的引用memo[self]。你知道吗

相关问题 更多 >

    热门问题