2012-03-03 9 views
0

我被困在試圖弄清楚如何正確聲明對象列表(列表)的對象。考慮下面的Python代碼:Python中自定義對象列表清單

short_list = [] * 5 
for in range(5): 
    c = MyClass() 
    short_list.append(c) 

super_list = [[short_list] * 100] * number_of_users 

super_list [0]旨在是其他列表的一些列表,它包含與用戶信息0,super_list用於用戶1,持續[1]。這些列表最終組織「MyClass」類型的對象組。我的問題是,設置super_list [0]內的列表元素的值也會更改super_list [1]中相應的列表元素。 super_list [0]和super_list [1]總是完全相同。

我該如何聲明short_list和/或super_list給我列表的相同的概念組織,我試圖實現super_list [0]和super_list [1]的行爲和行爲作爲兩個單獨的列表?

回答

0

您必須手動構建它們:

super_list = [] 
for i in xrange(100): 
    short_list = [] 
    for j in xrange(5): 
     short_list.append(MyClass()) 
    super_list.append(short_list) 

或者更短,但是可能不易閱讀:

super_list = [[MyClass() for j in xrange(5)] for i in xrange(100)] 
0

[] * 5是在Python(嘗試在交互式解釋或IPython都等於[] )。

您構建super_list時要副本列表。默認情況下分配一個列表(這就是*運算符背後的內容)只會產生一個新的引用。試試這個:

[ short_list[:] for stub in xrange(100) ] 

那克隆列表中多次使用切片語法。這是淺拷貝列表的Pythonic方式。

如果您需要深拷貝,你可以import copy並使用deepcopy方法。

+0

儘管如此,'super_list [0] [0] super_list [1] [0]',雖然現在你已經解決了super_list的'問題[0] super_list [1]'。 – icktoofay 2012-03-03 04:03:30

+0

不錯,謝謝。雖然我從OP的問題中收集到了不需要深層複製的問題,但增加了一個評論:深層複製。 – 2012-03-03 04:06:10