2012-03-06 128 views
0

我試圖創建一個對象列表(元素),其中每個元素包含對象列表(GaussPoints)。每個元素的高斯點數可以是可變的,儘管在下面的例子中爲簡單起見每個元素只有一個高斯點。包含對象列表的對象列表

class Element: 
    gp = [] 

class GaussPoint: 
    argument = 0 


k = 0 
elements = [] 
for ele in xrange(4): 
    k = k+1 
    anEle = Element() 

    aGP = GaussPoint() 
    aGP.argument = k 
    print k 

    elements.append(anEle) 

    elements[ele].gp.append(aGP) 

print "testing the data structure:" 
for ele in xrange(4): 
    print elements[ele].gp[0].argument 

輸出是:

1 
2 
3 
4 
testing the data structure: 
1 
1 
1 
1 

我很期待將是:

1 
2 
3 
4 
testing the data structure: 
1 
2 
3 
4 

莫名其妙的代碼不會創建GaussPoints每個元素的一個新的列表,但追加到同一個。

我明顯地誤解了一些關於Python的基礎知識。任何人都可以請幫忙?

回答

3

你需要讓Element.gp一個實例變量,就像這樣:

class Element: 
    def __init__(self): 
     self.gp = [] 

目前,gp類本身的成員,是由類的所有實例共享的效果。你在一箇中改變它,它似乎總是改變。

這無疑是好作風作出同樣改變GaussPoint.argument

class GaussPoint: 
    def __init__(self): 
     self.argument = 0 

最後,我建議你閱讀的tutorial on classes

+0

謝謝,您指出我在正確的方向。儘管如此,問題仍然出現在列表「gp」中:'class Element: def __init __(self): self.gp = []' – mululu 2012-03-06 11:37:03

2

您正在將Element.gp初始化爲類變量而非實例變量,因此它在所有對象中共享。你結束了1 gp是長度爲4的陣列,而不是4個gp小號長度的1

相反,初始化它在__init__方法如下所示:

class Element: 
    def __init__(self): 
     self.gp = [] 

你正在做argument一個類變量,但是因爲你爲每個實例重新分配它,而不是像你做的那樣修改它,它最終會保持你期望的值。

相關問題