我在访问dict中放入了什么传递给我的用户定义的__deepcopy__函数?

时间:2010-11-02 14:37:34

标签: python deep-copy

我需要为我的一个类定义自己的deepcopy函数。 documentation表示函数__deepcopy__()传递了一个备忘录字典,用于跟踪哪些对象已被复制,以避免陷入处理递归对象。然而,它并没有说什么放在字典中。我是否放置了对象或对象ID?你如何使用它?我找不到任何解释它的网站,除了this书之外说它不需要使用,除了将其传递给__deepcopy__的其他调用。

由于

2 个答案:

答案 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]