2015-04-19 78 views
1

我遇到了一些我認爲不是很困難的問題,但是我找不到任何答案。Python:複製兩個依賴列表以及它們的依賴關係

我有兩個對象列表,每個對象列表都包含另一個對象列表。我想複製它們,以便在重複此過程之前進行來檢測並評估結果。最後,我會保持最好的結果。

但是,當複製每個列表時,結果不是兩個依賴列表,而是兩個不再相互作用的列表。我該如何解決這個問題?有一些正確的方法來做到這一點嗎?

給定兩個類定義如下。

import copy 

class event: 

    def __init__(self, name): 
     self.name = name 
     self.list_of_persons = [] 

    def invite_someone(self, person): 
     self.list_of_persons.append(person) 
     person.list_of_events.append(self) 

class person: 

    def __init__(self, name): 
     self.name = name 
     self.list_of_events = [] 

我試圖寫一些我正面臨的情況的簡單例子。打印功能顯示兩個列表中的對象標識符不同。

# Create lists of the events and the persons 
the_events = [event("a"), event("b")] 
the_persons = [person("x"), person("y"), person("z")] 

# Add some persons at the events 

the_events[0].invite_someone(the_persons[0]) 
the_events[0].invite_someone(the_persons[1]) 

the_events[1].invite_someone(the_persons[1]) 
the_events[1].invite_someone(the_persons[2]) 


print("Original :", id(the_persons[1]), id(the_events[0].list_of_persons[1]), id(the_events[1].list_of_persons[0])) 


# Save the original configuration 
original_of_the_events = copy.deepcopy(the_events) 
original_of_the_persons = copy.deepcopy(the_persons) 

for i in range(10): 

    # QUESTION: How to make the following copies? 
    the_events = copy.deepcopy(original_of_the_events) 
    the_persons = copy.deepcopy(original_of_the_persons) 

    print(" i =", i, ":", id(the_persons[1]), id(the_events[0].list_of_persons[1]), id(the_events[1].list_of_persons[0])) 

    # Do some random stuff with the two lists 
    # Rate the resulting lists 
    # Record the best configuration 

# Save the best result in a file 

我想過使用一些字典,進行獨立的名單,但是這將意味着大量的代碼修改,我想避免的。

非常感謝您的幫助!我對Python和StackExchange都是新手。

+0

我覺得你不明白你在問什麼。 「依賴」和「依賴」列表是什麼意思?您能否提供一些例子,說明每個清單的內容以及相應的預期內容? – EvenLisle

+0

對不起。我的意思是複製後,修改'event'類中的'person'不會導致'the_persons'列表中相應'person'的修改。我希望他們仍然聯繫在一起。如果你執行這個代碼,你會得到如下的東西:'Original:49619744 49619744 49619744' while the loop,you get:'i = 0:52093840 52093448 52093448''所以對象是相同的('id'是不同的)。這就是我的意思是依賴。我希望這能澄清我的問題。 – Ted

回答

0

由於deepcopy會複製被複制事物的所有底層對象,因此對深層複製執行兩個獨立調用會中斷對象之間的鏈接。如果你創建一個引用了這些東西(比如字典)的新對象並複製該對象,那將會保留對象引用。

workspace = {'the_persons': the_persons, 'the_events': the_events} 
cpw = copy.deepcopy(workspace) 
+0

非常感謝!這節省了我!我也嘗試過一個元組,它也運行得很好。我已經明白了什麼是錯誤的,但不知道如何複製這些對象:這非常好。謝謝! – Ted