2024-05-29 02:57:37 发布
网友
我需要为我的一个类定义自己的deepcopy函数。documentation表示函数__deepcopy__()被传递一个备忘录字典,用于跟踪哪些对象已经被复制,以避免在处理递归对象时被捕获。然而,它没有说什么放在字典里。我是把对象放进去,还是对象ID?你怎么用它?我找不到任何网站来解释它,除了this一本书说它不需要被使用,除了把它传递给__deepcopy__的其他调用。你知道吗
__deepcopy__()
__deepcopy__
谢谢
为了与内置的copy.deepcopy行为保持一致,应该使用对象的id作为键。你知道吗
copy.deepcopy
id
更多详情:
虽然通常可以使用不同的密钥方案(例如对象本身,如果它是可哈希的),但只要保持一致,仍然会遇到麻烦。通常__deepcopy__是通过对某些包含的属性调用copy.deepcopy来实现的。如果您直接向memo添加项,您必须确定键不会与copy.deepcopy添加的项冲突,后者添加由id生成的键,这些键是整数。你知道吗
memo
因此,如果使用不同的密钥方案,例如直接将对象用作密钥,则不能添加任何整数对象。你知道吗
底线:
只使用id要容易得多,而且不必担心上面的异常。你知道吗
回答我自己的问题,感谢@Jon Eric:
我从http://www.doughellmann.com/PyMOTW/copy/所示的示例中了解到,您使用self作为键,使用复制的对象作为值。然后,当再次尝试复制这个对象(self)时,可以检查memo字典以查看它是否已经被复制,并返回对副本的引用memo[self]。你知道吗
self
memo[self]
为了与内置的
copy.deepcopy
行为保持一致,应该使用对象的id
作为键。你知道吗更多详情:
虽然通常可以使用不同的密钥方案(例如对象本身,如果它是可哈希的),但只要保持一致,仍然会遇到麻烦。通常
__deepcopy__
是通过对某些包含的属性调用copy.deepcopy
来实现的。如果您直接向memo
添加项,您必须确定键不会与copy.deepcopy
添加的项冲突,后者添加由id
生成的键,这些键是整数。你知道吗因此,如果使用不同的密钥方案,例如直接将对象用作密钥,则不能添加任何整数对象。你知道吗
底线:
只使用
id
要容易得多,而且不必担心上面的异常。你知道吗回答我自己的问题,感谢@Jon Eric:
我从http://www.doughellmann.com/PyMOTW/copy/所示的示例中了解到,您使用
self
作为键,使用复制的对象作为值。然后,当再次尝试复制这个对象(self
)时,可以检查memo字典以查看它是否已经被复制,并返回对副本的引用memo[self]
。你知道吗相关问题 更多 >
编程相关推荐