我有一个K()
类,其__add__()
方法的工作原理如下
d_1 = K(dict(a=3, b=5), dict(b=45,c=23))
d_2 = K(dict(a='three',b='two'), dict(b='wa',c='wo'))
>>d = d_1 + d_2
>>d == K({'a': 3, 'b': 5}, {'b': 45, 'c': 23}, {'a': 'three', 'b': 'two'}, {'b': 'wa', 'c': 'wo'})
True
但是,如果我更改了一些数据
d_1['c'] = 'apples'
d_2['c'] = 'oranges'
再次检查......
>>d == K({'a': 3, 'b': 5}, {'b': 45, 'c': 23}, {'a': 'three', 'b': 'two'}, {'b': 'wa', 'c': 'wo'})
False
更改的数据影响了原始添加方法。我尝试使用.copy()来创建我们正在添加的变量的副本,然后使用它们 - 但是我还没有运气......
def __add__(self, other):
scopy, ocopy = self.copy(),other.copy()
slist,olist = [],[]
for x in scopy.list_of_dictionaries_from_init:
self_temp.append(x)
for i in other_copy.list_of_dictionaries_from_init:
temp.append(i)
return K(*(self_copy.list_of_dictionaries_from_init + olist))
这完全没有用
我不确定如何使用副本
答案 0 :(得分:1)
这里的问题是你的copy
方法可能只是制作一个具有相同词汇的新列表。当您复制其元素本身是可变集合的集合时,它们不会被复制。
如果要复制“完全”,请使用deepcopy
功能。例如,您可以更改自己的copy
方法以致电deepcopy
。 (也可能是你的__init__
方法。)
例如,可能是这样的:
def copy(self):
return K(copy.deepcopy(self.list_of_dictionaries_from_init))
同时,您的add
方法没有任何意义。您创建了slist
和olist
列表,但之后尝试附加到self_temp
和temp
列表,然后尝试使用self_temp
,就好像它是K
实例而不是列表。如果您有copy
方法,首先定义__iadd__
,然后根据它定义__add__
可能更简单:
def __iadd__(self, other):
self.list_of_dictionaries_from_init += other.list_of_dictionaries_from_init
def __add__(self, other):
self_copy = self.copy()
self_copy += other
return self_copy