无法进行酸洗时如何进行深度复制

how to deepcopy when pickling is not possible

我正在尝试深度复制 Python 3.4 中的字典,但某些值不是 "pickable",即当我尝试深度复制字典时,它会引发 RuntimeError 异常

*** RuntimeError: Pickling of "DataObject" instances is not enabled (http://www.boost.org/libs/python/doc/v2/pickle.html)

深度复制字典的最佳选择是什么?

到目前为止,我正在递归遍历字典并创建一个新字典,但我想知道是否有更稳健和优雅的解决方案。

注意:我无法修改 DataObject 结构以支持 pickling。

您可以向 copyreg module 添加复制函数来处理无法 pickle 的类型:

import copyreg

pickle_dataobject(do):
    return DataObject, (do.arg1, do.arg2)

copyreg.pickle(DataObject, pickle_dataobject)

这个想法是你 return 一个构造函数和要传递给构造函数的参数以重新创建原始值。

copy.deepcopy() 函数然后使用上面的 pickle_dataobject()ob is DataObject 为真时获取副本(在 copyreg.dispatch_table 中查找 class copyreg.pickle() 添加你的函数的字典)。