2014-02-18 12 views
2

對象列表我有一個類,它是一個根容器。這個容器有一個將保存對象的列表成員。這些對象中的每一個還包含一個子對象列表,這些子對象又包含其他子對象。我想使用列表,因爲訂購對手頭的應用程序很重要。Python的基本問題看當創建一個用於存放其他物品

問題:我看到的是子類的對象的列表不包含正確的一組對象和列表的長度是不是我的預期。

下面是一些示例代碼(代碼可以被複制並執行),並且是相當直截了當。我用Python 2.6.2。

class mycls2: 
    olist = [] 

class mycls1: 
    olist = [] 

class mycl: 
    olist = [] 

class myc: 
    x = 0 
    def __init__(self, i): 
    self.x = i 

def test_obj1(): 
    kctr = 0 
    mylist = mycl() 
    for i in range(0, 2): 
    s1 = mycls1() 
    print "s1: ", s1 
    for j in range(0, 2): 
     s2 = mycls2() 
     print "s2: ", s2 
     for k in range(0, 2): 
     c = myc(kctr) 
     kctr += 1 
     print " c: ", c 
     s2.olist.append(c) 
     print "Adding C ", c, " to S2 ", s2, " Len:", len(s2.olist) 
     s1.olist.append(s2) 
     print "Adding S2 ", s2, " to S1 ", s1, " Len:", len(s1.olist) 
    mylist.olist.append(s1) 
    print "Adding S1 ", s1, " to ML ", mylist, " Len:", len(mylist.olist) 

    print '========================================' 
    print "MyCL1List:", len(mylist.olist) 
    for mycl1_iter in mylist.olist: 
    print mycl1_iter 
    print "MyCL2List:", len(mycl1_iter.olist) 
    for mycl2_iter in mycl1_iter.olist: 
     print mycl2_iter 
     print "MyCL:", len(mycl2_iter.olist) 
     for mycl_ter in mycl2_iter.olist: 
     print mycl_ter 
    print '========================================' 

if __name__ == "__main__": 
    test_obj1() 

輸出段:

Line: 1 s1: <__main__.mycls1 instance at 0x023ABC60> 
Line: 2 s2: <__main__.mycls2 instance at 0x023ABC88> 
Line: 3 c: <__main__.myc instance at 0x023ABCB0> 
Line: 4 Adding C <__main__.myc instance at 0x023ABCB0> to S2 <__main__.mycls2 instance at 0x023ABC88> Len: 1 
Line: 5 c: <__main__.myc instance at 0x023ABCD8> 
Line: 6 Adding C <__main__.myc instance at 0x023ABCD8> to S2 <__main__.mycls2 instance at 0x023ABC88> Len: 2 
Line: 7 Adding S2 <__main__.mycls2 instance at 0x023ABC88> to S1 <__main__.mycls1 instance at 0x023ABC60> Len: 1 
Line: 8 s2: <__main__.mycls2 instance at 0x023ABD00> 
Line: 9 c: <__main__.myc instance at 0x023ABD28> 
Line: 10 Adding C <__main__.myc instance at 0x023ABD28> to S2 <__main__.mycls2 instance at 0x023ABD00> Len: 3 

問題:

1)線8,9和10中看到的行爲是不符合期望。

Line: 8 s2: <__main__.mycls2 instance at 0x023ABD00> <-- New S2 object created here 

Line: 9 c: <__main__.myc instance at 0x023ABD28> <-- New c object created here 

Line: 10 Adding C <__main__.myc instance at 0x023ABD28> to S2 <__main__.mycls2 instance at 0x023ABD00> Len: 3 <-- Adding newly created c to new s2. 

它是如何的長度爲3,在第10行,當新創建的對象應具有剛添加的對象後具有長度1。

2)當打印清單我看到更多的項目添加到我的預期列表的內容。我預計S2對象中只有2個C對象?爲什麼會發生?

Line: 43 <__main__.mycls2 instance at 0x023ABD00> <-- Would have expected only 2 C objects here 
Line: 44 MyCL: 8 
Line: 45 <__main__.myc instance at 0x023ABCB0> 
Line: 46 <__main__.myc instance at 0x023ABCD8> 
Line: 47 <__main__.myc instance at 0x023ABD28> 
Line: 48 <__main__.myc instance at 0x023ABD50> 
Line: 49 <__main__.myc instance at 0x023ABDC8> 
Line: 50 <__main__.myc instance at 0x023ABDF0> 
Line: 51 <__main__.myc instance at 0x023ABE40> 
Line: 52 <__main__.myc instance at 0x023ABE68> 
Line: 53 <__main__.mycls2 instance at 0x023ABDA0> 

我想我錯過了一些基本的東西,請問有人可以幫忙嗎?

回答

1
class mycls2: 
    olist = [] 

class mycls1: 
    olist = [] 

class mycl: 
    olist = [] 

在所有這些類中,olist是一個類變量。所以,這些類的所有實例將共享對應於其類的olist

你需要的是實例變量。

class mycls2: 
    def __init__(self): 
    self.olist = [] 

class mycls1: 
    def __init__(self): 
    self.olist = [] 

class mycl: 
    def __init__(self): 
    self.olist = [] 
+0

感謝分享,我很欣賞的快速反應。 – MSR

+0

@MSR歡迎您:) – thefourtheye

相關問題