我需要为我的一个类定义我自己的 deepcopy 函数。文档说该函数被__deepcopy__()
传递了一个备忘录字典,用于跟踪哪些对象已经被复制,以避免在处理递归对象时陷入困境。然而,它并没有说明在字典中放什么。我是放入对象还是对象 ID?你如何使用它?我找不到任何解释它的网站,除了这本书说不需要使用它,除非将它传递给__deepcopy__
.
谢谢
为了与内置copy.deepcopy
行为一致,您应该使用id
对象的作为键。
更多细节:
虽然您通常可以避免使用不同的密钥方案(例如对象本身,如果它是可散列的),但只要您保持一致,您仍然会遇到麻烦。经常__deepcopy__
通过调用copy.deepcopy
一些包含的属性来实现。如果您直接将项目添加到memo
,则必须确定键不会与添加的项目发生冲突copy.deepcopy
,这会添加由 生成的键id
,它们是整数。
因此,如果您使用不同的键方案,例如直接使用对象作为键,则永远无法添加任何整数对象。
底线:
使用起来要容易得多id
,而不必担心上述异常。
感谢@Jon-Eric,回答我自己的问题:
我从http://www.doughellmann.com/PyMOTW/copy/显示的示例中了解到,您将self
其用作键,将复制的对象用作值。然后,当它再次尝试复制此对象(self
)时,可以检查备忘录字典以查看它是否已被复制,并返回对副本的引用,memo[self]
.