2015-04-29 55 views
1

我有一個類K()有一個__add__()方法,如果我改變了一些數據添加類,防止更改索引從影響數據

d_1['c'] = 'apples' 
d_2['c'] = 'oranges' 

,並再次檢查該工作原理如下

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 == K({'a': 3, 'b': 5}, {'b': 45, 'c': 23}, {'a': 'three', 'b': 'two'}, {'b': 'wa', 'c': 'wo'}) 
False 

不斷變化的數據影響了原點l加法。我已經使用.copy()來創建我們增加了變量的副本和使用,無論those-我沒有任何運氣嘗試...

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

這項工作在這裏的問題是,你的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