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