2015-10-16 36 views
1

我想列出一個操作列表(每個操作都由一個corersponding類描述),然後讓我的runner類遍歷它並根據一些規則執行它們。某些操作可能會多次出現在列表中,並具有不同的參數。但是,每個操作都有一些內部數據,這些內部數據應該被計算一次並在以後的調用中重用。將不同的對象狀態添加到列表中

我的想法是隻創建一次操作,然後只是修改不同的屬性。但是這不起作用。

我的測試代碼:

class my_op_class(object): 
    def __init__(self): 
     self.data = 1 

lst = list() 
my_op = my_op_class() 

my_op.param = 2 
lst.append(my_op) 

my_op.param = 3 
lst.append(my_op) 

for l in lst: 
    print l.data, l.param 

我所期望的輸出如下:

1 2 
1 3 

那些在蟒蛇好會看到列表中的條目都將PARAM = 3。

我或多或少的理解了爲什麼,但我沒有看到如何獲得我期望的行爲。

+0

爲什麼你所期望的輸出,你現在還不清楚沒有。你明確地*改變*完全相同的對象*上的屬性,它在同一個列表中被引用兩次。爲什麼不創建該類的兩個實例,並將'data'作爲'__init__'的參數? – jonrsharpe

回答

1

您的列表正在引用同一對象的多個副本。該對象具有單個參數值,因此當您更改參數值時,它將在所有參考上更改它。

每次將其添加到列表中時,都需要創建一個新實例。你可以通過直接調用構造函數:

class my_op_class(object): 
    def __init__(self): 
     self.data = 1 

lst = list() 

my_op = my_op_class() 
my_op.param = 2 
lst.append(my_op) 

my_op = my_op_class() 
my_op.param = 3 
lst.append(my_op) 

for l in lst: 
    print l.data, l.param 

,或者您可以使用copy.deepcopy在每次追加到列表時,創建一個新的實例:

import copy 

class my_op_class(object): 
    def __init__(self): 
     self.data = 1 

lst = list() 
my_op = my_op_class() 

my_op.param = 2 
lst.append(copy.deepcopy(my_op)) 

my_op.param = 3 
lst.append(copy.deepcopy(my_op)) 

for l in lst: 
    print l.data, l.param 
+0

對不起,我沒有看到兩個代碼片段之間的區別。
除此之外,我的想法是在整個過程中保持「數據」,例如調用該操作會初始化數據,所有其他所有調用都將重新使用並更新它。從我理解的閱讀答案來看,我的方法並不合適。我必須爲此創建另一個問題嗎? –

+0

哎呀,我在第一個複製了錯誤的片段。我更新了它。如果只是簡單的數據,我建議只使用字典而不是類,並在每次將其添加到列表時將my_dict.copy()附加到列表。 – Colin

+0

我標記爲接受,因爲它讓我真正明白我的方式是錯誤的。最後去了一個元組列表,如[(op,param1),(opn param2)] –

相關問題