2014-09-11 108 views
1

我有這樣的例子代碼在類實例之間共享列表的正確方法是什麼?

my_list = ["a","b","c","d"] 

class A: 
    def __repr__(self): 
     return ', '.join(my_list) 

    def add(self, num): 
     my_list.append(num) 



class_list = [] 
for x in range(5): 
    class_list.append(A()) 
    class_list[x].add("class_%s" % (x)) 
    print class_list[x] 

礦的非示例代碼是比較複雜的,但這個想法是,我有過類的多個實例做一個「東西」。全局my_list用於所有實例。當某個類內部滿足某個邏輯時,該實例將修改該列表。其餘的課程將利用該列表來執行其邏輯。任何實例都可以添加到列表中,並且所有實例都應該能夠使用更新後的值。

現在在這個例子中,my_list是共享的,但這是正確的方法嗎?

+1

附註:總是在Python 2.x中始終使用'class A(object):',而不是'class A:'。否則,你正在創建經典類,它有各種各樣的怪癖和錯誤特徵,其中一些危險地接近你想要在這裏做的事情。 – abarnert 2014-09-11 00:55:43

+0

爲什麼不將全局列表作爲參數傳遞給每個實例'__init__'?列表按引用傳遞,因此每個實例都可以讀取和修改列表(假設您沒有處理併發)。 – MikeRand 2014-09-11 00:56:58

回答

4

一個類的屬性是通常比全球更好,因爲然後他們只是彼此分享,而不是與世界上的每個人分享。

爲了做到這一點,移動my_list = ["a","b","c","d"]線下class A:,和每一個參考my_list改變self.my_listA.my_list

class A(object): 
    shared_list = [] 
    def add(self, num): 
     self.my_list.append(num) 

然而,實例屬性是往往甚至更​​好。如果您將相同的列表分配給一堆不同的變量,它仍然只是一個列表;改變它會影響所有這些變量。所以,你可以做這樣的事情:

class A(object): 
    def __init__(self, shared_list): 
     self.shared_list = shared_list 
    def add(self, num): 
     self.shared_list.append(num) 

現在,它是由一個使用A對象來決定是否給予他們相同的列表中的代碼。你甚至可以創建共享20個實例共享一個列表,和10不同的一個:

list1 = [] 
group1 = [A(list1) for _ in range(20) 
list2 = [] 
group2 = [A(list2) for _ in range(10) 

的問題是,是否來電,或A類,或者沒有一個人是一個誰應該做出如何「共享」清單的決定。對於不同的應用程序,答案是不同的,所以很難給出一個像Amy_list這樣的名稱的抽象例子的答案。

+2

今天在西方的速度更快的槍:-) – mgilson 2014-09-11 00:56:25

+0

@mgilson:當我用一分鐘的編輯 - 編譯 - 調試周期來處理一個項目時,會發生這種情況,就像這次回到了石器時代之類的事情。 (現在我年輕的自己會用堆疊的摺疊紙帶着我在夜間批量工作中編譯錯誤。) – abarnert 2014-09-11 01:00:52

+0

如果我使用第二個選項,是否意味着如果我更新'list1',所有'group1'實例有權訪問新列表? – 2014-09-11 01:17:49

相關問題