繁体   English   中英

包含对象列表的对象列表

[英]list of objects containing lists of objects

我正在尝试创建对象(元素)的列表,其中每个元素都包含对象(GaussPoints)的列表。 每个元素的GaussPoint的数量可以是可变的,尽管在下面的示例中,为简单起见,每个元素只有一个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的一些基本知识。 谁能帮忙吗?

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

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

当前, gp该类本身的成员,并且实际上由该类的所有实例共享。 您将其更改为一个,它似乎全部都更改了。

GaussPoint.argument进行相同的更改可以说是很好的样式:

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

最后,我建议阅读有关class教程

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

而是使用__init__方法将其初始化,如下所示:

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

您正在将argument设为类变量,但是由于您为每个实例都重新分配了它,而不是像element那样对其进行修改,因此它最终保留了您期望的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM