包含对象列表的对象列表

时间:2012-03-06 11:27:05

标签: python

我正在尝试创建一个对象列表(Elements),其中每个元素都包含一个对象列表(GaussPoints)。每个元素的GaussPoints数量可以变化,但在下面的示例中,为简单起见,每个元素只有一个GaussPoint。

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的基本信息。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

您需要将Element.gp设为实例变量,如下所示:

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

目前,gp类本身的成员,实际上是由该类的所有实例共享的。你把它改成一个,它似乎总是改变。

GaussPoint.argument进行相同的更改可能是好的风格:

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

最后,我建议您阅读tutorial on classes

答案 1 :(得分:2)

您正在将Element.gp初始化为类变量,而不是实例变量,因此它在所有Element个对象中共享。最终,1 gp是一个长度为4的数组,而不是长度为1的4 gp

相反,请使用__init__方法初始化它,如下所示:

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

你正在使argument成为一个类变量,但是因为你为每个实例重新分配它,而不是像你element那样修改它,它最终会保留你期望的值。 / p>