如何在for循环中正确更新变量?循环内累加计算失效问题排查
问题修复方案
你这个r迭代失效基本是变量名笔误导致的,按下面步骤改就行:
核心错误点
Python对变量名大小写敏感,你计算k的分母里写的是Area(r, c1, c2),但前面定义的参数是大写的C1、C2。如果之前你不小心定义过小写的c1、c2为固定常量,这里不会报错,但Area计算结果会恒定,直接导致k算出来是固定值甚至0,看起来r完全没更新。
修复步骤
- 修正大小写笔误,把分母里的小写c1、c2改成大写C1、C2:
# 错误写法 k = ( dt * ( Q_r1 + Q_r2 + Q_t(A, tide, r, C1) * n1 + Q_to(A, tide, r, C2) * n2 - Q_g1(H1, W1, tide, r, C3) * n3 - Q_g2(H2, W2, tide, r, C4) * n4 ) / Area(r, c1, c2) ) # 修正后 k = ( dt * ( Q_r1 + Q_r2 + Q_t(A, tide, r, C1) * n1 + Q_to(A, tide, r, C2) * n2 - Q_g1(H1, W1, tide, r, C3) * n3 - Q_g2(H2, W2, tide, r, C4) * n4 ) / Area(r, C1, C2) ) - 删掉冗余的中间变量赋值,你现在写的
r_1 = r +k; r = r_1完全可以换成r += k,效果一模一样,还能少写两行减少笔误。 - 加调试日志排查问题,如果改完大小写还是不对,就在for循环第一行加打印,确认每轮开头的r是不是上一轮算出来的值:
for i in range(len(e_s)-1): print(f"轮次{i},初始r={r}") # 加这行 # 后面接原有逻辑- 要是打出来的r每轮都等于最开始的初始值,说明你循环里某个地方误把r重置回初始值了,找出来删掉就行
- 要是r确实在迭代,但结果不符合预期,就去查你自定义的
Q_t/Q_to/Q_g1/Area几个函数的逻辑,大概率是流量项加减抵消,导致k一直是0。
修正后完整代码
el_r = list() r = e_s.iloc[0,1] for i in range(len(e_s)-1): Q_r1= q_r.iloc[i,1] Q_r2= q_r.iloc[i,2] tide = e_s.iloc[i,1] k = ( dt * ( Q_r1 + Q_r2 + Q_t(A, tide, r, C1) * n1 + Q_to(A, tide, r, C2) * n2 - Q_g1(H1, W1, tide, r, C3) * n3 - Q_g2(H2, W2, tide, r, C4) * n4 ) / Area(r, C1, C2) ) r += k print(k, r) el_r.append((i+1, tide, r))
运行结果参考:
内容的提问来源于stack exchange,提问作者손상우
相关产品推荐
相关产品推荐


