添加类,防止更改索引影响数据

时间:2015-04-29 00:49:59

标签: python dictionary operator-overloading

我有一个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))

这完全没有用

我不确定如何使用副本

1 个答案:

答案 0 :(得分:1)

这里的问题是你的copy方法可能只是制作一个具有相同词汇的新列表。当您复制其元素本身是可变集合的集合时,它们不会被复制。

如果要复制“完全”,请使用deepcopy功能。例如,您可以更改自己的copy方法以致电deepcopy。 (也可能是你的__init__方法。)

例如,可能是这样的:

def copy(self):
    return K(copy.deepcopy(self.list_of_dictionaries_from_init))

同时,您的add方法没有任何意义。您创建了slistolist列表,但之后尝试附加到self_temptemp列表,然后尝试使用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