使用for循环在函数中迭代不起作用?

2024-10-04 03:19:48 发布

您现在位置:Python中文网/ 问答频道 /正文

当我在函数中使用for循环时(见下文),for循环下面的语句块不会被迭代

def F(rho, m, E, v_rho, v_m, v_E):
    for n in xrange(N):
        #Update conserved quantities
        rho = G(Evolve_rho1(rho))
        m = momentum(Evolve_m1(m))
        E = Energy(Evolve_E1(E))
        v_rho = rho_v(Evolve_rho_v(rho))
        v_m = m_v(Evolve_mv(m))
        v_E = E_v(Evolve_Ev(E))

    return (rho, m, E, v_rho, v_m, v_E)

因为以这种方式调用函数后:density, momentum, Energy, dflux, mflux, Eflux = F(rho, m, E, v_rho, v_m, v_E),并且 例如打印密度,会导致错误答案。在

但如果我只使用下面的循环,它工作得很好。在

^{pr2}$

等等,给出正确的结果。在

欢迎任何建议。在


Tags: 函数infordefupdate语句energyrho
2条回答

函数使用全局变量而不是局部变量,这些变量在F()中的每次迭代中都会更新。解决方案是将变量作为参数传递并定义

def F(rho, m, E, v_rho, v_m, v_E):
    for n in xrange(N):                                  
        rho = G(Evolve_rho1(rho,v_rho,m))
        m  = momentum(Evolve_m1(rho,v_rho, m,v_m,E))
        E = Energy(Evolve_E1(rho, m, E, v_E))
        v_rho = rho_v(Evolve_rho_v(rho,v_rho,m))
        v_m =   m_v( Evolve_mv(rho,v_rho, m,v_m,E)) 
        v_E  =  E_v(Evolve_Ev(rho, m, E, v_E))
    return (rho, m, E, v_rho, v_m, v_E) 

感谢大家的贡献。在

我猜你错过了N的全局和本地vlue之间的区别。正如您所写的,F函数中的N的值将是调用F时的N,而不是定义它时的N。因此,如果在F被调用N==0,那么循环块将永远不会执行。在

相关问题 更多 >