我写了一个模拟代码,我想为我的代码插入初始值。
some def are here,
class multipole:
def q(self, f1,f2,f3):
t=0.
tm=0.
xp = idistribution(j,m) # initial xp values it is a list of particles velocities
while t< k:
rk(t,m,f1,f2,f3,xp) # calculate new xp value
xp.append(xxp[1])
return xp
def h(self, f1,f2,f3):
t=0.
tm=0.
xp = idistribution(j,m) # initial xp values it is a list of particles velocities
while t< k:
rk(t,m,f1,f2,f3,xp) # calculate new xp value
xp.append(xxp[1])
return xp
if __name__ == "__main__":
qp=multipole()
quxp=qp.q(0.,0.,0.)
hxp=qp.h(0.052,0.,0.)
我的问题是,当我调用xp = idist(j,m)时,它将返回随机分布的离子速度,但我想对两种类方法(q和h)使用相同的分布,我该怎么做?提前致谢。 (我是python的新手,我试图从一些网页上学习它)
答案 0 :(得分:1)
将其设为类属性并计算一次:
class Multipole:
xp = idistribution(j,m)
def q(self, f1,f2,f3):
t=0.
tm=0.
xp = Multipole.xp[:]
如果是平面列表,您可以制作浅色副本,如果您不将任何更改复制到方法中的xp
,则会反映在有Multipole.xp
引用的任何位置。如果它包含其他对象,则需要执行copy.deepcopy
答案 1 :(得分:0)
您可以将xp
作为附加参数传递给q
和h
:
class multipole:
def q(self, f1, f2, f3, xp):
....
def h(self, f1, f2, f3, xp):
....
if __name__ == "__main__":
xp = idistribution(j,m)
xp1 = xp[:] # copy, so that xp stays untouched
xp2 = xp[:] # copy, so that xp stays untouched
qp=multipole()
quxp=qp.q(0. , 0., 0., xp1)
hxp=qp.h(0.052, 0., 0., xp2)
# xp1 and xp2 now contains your results
答案 2 :(得分:0)
在类中添加一个init方法,以便每个实例都有xp
的值,两个方法都会使用它。
class Multipole:
def __init___(self):
self.xp = idistribution(j,m)
#rest of code
然后在任何需要xp。
的地方使用xp = self.xp[:]
这将允许您使每个Multipole
实例使用不同的分发,但对给定实例上的两个方法的调用将使用相同的分发。