我正在尝试创建一个对象列表(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的基本信息。有人可以帮忙吗?
答案 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>