2010-02-04 99 views
20

我試圖將一個對象添加到列表,但自從我加入了實際的對象,當我嘗試之後重置列表,列表中的所有值復位。 是否有一種實際的方式可以將監視器對象添加到列表中,並更改值並且不會影響已保存在列表中的那些值?對象添加到Python列表

感謝

代碼:

arrayList = [] 

for x in allValues: 


     result = model(x) 

     arrayList.append(wM) 

     wM.reset() 

其中WM是顯示器類 - 正計算/模型方法計算出

+3

我不明白你的問題。顯示出現問題的一些簡單代碼可能會有所幫助。 – 2010-02-04 02:23:57

+3

什麼是「數組列表」?一個「列表」? – 2010-02-04 02:50:06

+0

是它的一個列表。 – Lilz 2010-02-04 03:05:48

回答

20

是你的問題與此類似:

l = [[0]] * 4 
l[0][0] += 1 
print l # prints "[[1], [1], [1], [1]]" 

如果是這樣,你只需要在你存儲它們複製的對象:

import copy 
l = [copy.copy(x) for x in [[0]] * 4] 
l[0][0] += 1 
print l # prints "[[1], [0], [0], [0]]" 

有問題的對象應該實現一個__copy__方法來複制對象。請參閱copy的文檔。您也可能對copy.deepcopy感興趣,這也在那裏。

編輯:這就是問題所在:

arrayList = [] 
for x in allValues: 
    result = model(x) 
    arrayList.append(wM) # appends the wM object to the list 
    wM.reset()   # clears the wM object 

您需要添加一個副本:

import copy 
arrayList = [] 
for x in allValues: 
    result = model(x) 
    arrayList.append(copy.copy(wM)) # appends a copy to the list 
    wM.reset()      # clears the wM object 

但我仍然感到困惑的地方wM的來源。難道你不是隻是一遍又一遍地複製同一個對象,除非在第一次之後清除它,所有其餘的都是空的?或者model()修改wM(這聽起來像是一個可怕的設計缺陷)?你爲什麼要扔掉result

+0

+1我在猜測OP的問題與此相關 – ghostdog74 2010-02-04 02:30:29

+0

非常感謝你的支持 – Lilz 2010-02-04 03:09:24

+0

@Lily - 如果你已經閱讀並思考過我的原始答案或ghostdog74的答案,那麼你可以自己做這個。您應該考慮閱讀文檔,特別是關於不可變與可變對象以及'copy'模塊。 – 2010-02-04 03:22:07

2

,而你應該表現出你的代碼看起來是這樣的給出了這個問題,我認爲這種情況非常普遍。見copy/deepcopy

+0

+1打我。 – 2010-02-04 02:29:16

3

您需要在修改其內容之前創建列表的副本。一個快捷鍵複製清單是這樣的:

mylist[:] 

例子:

>>> first = [1,2,3] 
>>> second = first[:] 
>>> second.append(4) 
>>> first 
[1, 2, 3] 
>>> second 
[1, 2, 3, 4] 

,並表明將修改的一部開拓創新的列表(默認行爲,因爲在Python中的名字只是給一個參考基礎對象):

>>> first = [1,2,3] 
>>> second = first 
>>> second.append(4) 
>>> first 
[1, 2, 3, 4] 
>>> second 
[1, 2, 3, 4] 

請注意,這隻適用於列表。如果您需要複製字典的內容,則必須按其他人的建議使用copy.deepcopy()

0

如果我是正確的認爲要添加變量,數組,但是當你改變陣列以外的變量,它也改變了數組裏面,但你不希望它那麼它是一個非常簡單的解。

當要保存的變量數組,你應該使用簡單的把STR(VARIABLENAME)把它變成一個字符串。例如:

array.append(str(variablename)) 

使用這種方法你的代碼應該是這樣的:

arrayList = [] 
for x in allValues: 
    result = model(x) 
    arrayList.append(str(wM))  #this is the only line that is changed. 
    wM.reset() 
+0

這給了我一個錯誤。 – 2014-05-15 07:20:24