亲爱的专家我正在尝试编写一个模拟,在我的代码中我有一个这样的类:
... (some def are here)
class multipole:
global xxp,yyp,zzp,x,y,z,xp,yp,zp,t,tm,h
xxp,yyp,zzp,x,y,z,xp,yp,zp =xxpyypzzp() # some initial values calling
@staticmethod
def quad(f1, f2,f3):
global t,h,mass,ksimax
while t < ksimax:
rk4_two(t,h,mass, f1, f2, f3, xxp, yyp, zzp) # rk function for new xxp, yyp and zzp
t = t + h
tm.append(t)
xp.append(xxp[1])
x.append(xxp[0])
yp.append(yyp[1])
y.append(yyp[0])
zp.append(zzp[1])
z.append(zzp[0])
return xp, x, yp,y,zp,z,tm
if __name__ == "__main__":
qp=multipole()
quxp, qux, quyp,quy,quzp,quz,qutm=qp.quad(0.,0.,0.)
hxp, hx, hyp,hy,hzp,hz,htm =qp.quad(0.022,0.,0.)
oxp, ox, oyp,oy,ozp,oz,otm =qp.quad(-0.023,-0.032,0.0 )
我的问题是这个代码只计算(quxp,qux,quyp,quy,quzp,quz,qutm),而不是其他的(其他人会将quxp,qux,quyp,quy,quzp,quz,qutm的值相同)你能告诉我为什么吗?我是python的新人,任何评论将不胜感激。
答案 0 :(得分:0)
忽略这段代码有点瑕疵的事实。我认为问题在于你使用的t
显然是全球性的,但你不能在任何地方重置它 - 所以这个循环:
while t < ksimax:
...
只会运行一次,除非您在某处重置t
。一些伪代码解释了为什么会发生这种情况:
counter = 0
def do_something():
global counter
print "Starting at", counter
while counter <= 10:
print counter
counter += 5
print "Done"
do_something()
# Starting at 0
# 0
# 5
# 10
# Done
do_something() # Called again, the counter is at 10 now:
# Starting at 10
# Done
正如其他人所提到的,您的代码可能会受益于一些重度重构。一些起点:
xxpyypzzp
甚至意味着什么?即使你今天对你很明显,即使对你来说也很难阅读,除非你有类似Rainman的记忆,否则下周你就不会理解。尝试使用描述性名称,如果您发现自己为变量添加了前缀或后缀,因为您的名称用完了 - 请考虑在类中封装一些复杂性。似乎后缀xp
,x
,yp
,y
,zp
,z
和tm
被大量使用。至少创建一个named tuple来保存这些值。global
语句,则有时间重新设计它。考虑一下代码的哪一部分应该&#34;拥有&#34;国家的哪个部分。