2012-03-06 131 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一个类变量,但是因为你为每个实例重新分配它,而不是像你做的那样修改它,它最终会保持你期望的值。

相关问题