我正在尝试使用一堆字典创建一个对象(例如下面的代码):
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__
函数,使其只生成对象的常规副本?此外,只要所有字典都具有不可变元素,我是否正确认为这将按预期工作(或者这不是一个好主意)?
答案 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
...