3

我需要为我的一个类定义我自己的 deepcopy 函数。文档说该函数被__deepcopy__()传递了一个备忘录字典,用于跟踪哪些对象已经被复制,以避免在处理递归对象时陷入困境。然而,它并没有说明在字典中放什么。我是放入对象还是对象 ID?你如何使用它?我找不到任何解释它的网站,除了本书说不需要使用它,除非将它传递给__deepcopy__.

谢谢

4

2 回答 2

1

为了与内置copy.deepcopy行为一致,您应该使用id对象的作为键。

更多细节:

虽然您通常可以避免使用不同的密钥方案(例如对象本身,如果它是可散列的),但只要您保持一致,您仍然会遇到麻烦。经常__deepcopy__通过调用copy.deepcopy一些包含的属性来实现。如果直接将项目添加到memo,则必须确定键不会与添加的项目发生冲突copy.deepcopy,这会添加由 生成的键id,它们是整数。

因此,如果您使用不同的键方案,例如直接使用对象作为键,则永远无法添加任何整数对象。

底线:

使用起来要容易得多id,而不必担心上述异常。

于 2010-11-02T14:45:20.507 回答
0

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

我从http://www.doughellmann.com/PyMOTW/copy/显示的示例中了解到,您将self其用作键,将复制的对象用作值。然后,当它再次尝试复制此对象(self)时,可以检查备忘录字典以查看它是否已被复制,并返回对副本的引用,memo[self].

于 2010-11-02T15:03:14.997 回答