用副本覆盖deepcopy

时间:2014-12-08 05:00:47

标签: python dictionary copy

我正在尝试使用一堆字典创建一个对象(例如下面的代码):

class test(object):
    def __init__(self):
       self.test_dict1 = {}
       self.test_dict2 = {}
       ...

我需要运行一系列假设情景,包括修改这些字典并根据它们计算某些内容。

a = test()
for i in range(1000):
   b = copy.deepcopy(a)

   # do stuff to b and output result
   ...

但是,大多数字典内容都保持不变。我可以使用copy.deepcopy(),但这非常慢,因为它必须复制所有字典内容(它非常大),并且b不会有很大差异a ,因此大部分引用a是有意义的,并且只覆盖b中修改的项的键。

由于字典不包含任何可变元素(即所有整数或字符串),因此在每个单独的字典上使用copy.copy()仍然可以正常工作并且速度会明显加快。但是,由于a是一个类对象,因此此代码也会修改a

# This code will modify a whenever b is modified
a = test()
for i in range(1000):
    b = copy.copy(a)

    # do stuff
    ...

如何重载__deepcopy__函数,使其只生成对象的常规副本?此外,只要所有字典都具有不可变元素,我是否正确认为这将按预期工作(或者这不是一个好主意)?

1 个答案:

答案 0 :(得分:0)

由于没有其他人为此尝试过解决方案,我将发布自己的解决方案。我最后修改了test类的构造函数,以便它可以接受参数然后传递字典的浅表副本,如下所示:

import copy

class test(object):
    def __init__(self, test_dict1 = {}, test_dict2 = {}):
       self.test_dict1 = test_dict1
       self.test_dict2 = test_dict2
    ...

a = test()

# Set up initial values for a
...

for i in range(1000):
    b = test(copy.copy(a.test_dict1), copy.copy(a.test_dict2)

    # do stuff
    ...