
在 Python 类中多次调用同一迭代方法(如 Jacobi_iteration())会导致循环计数器被重复初始化,从而返回错误的迭代次数;根本原因在于方法被调用了两次,而非循环逻辑本身出错。
在 python 类中多次调用同一迭代方法(如 `jacobi_iteration()`)会导致循环计数器被重复初始化,从而返回错误的迭代次数;根本原因在于方法被调用了两次,而非循环逻辑本身出错。
你在调试 diag_iterator 类时观察到 Jacobi_iteration() 返回的 itr 值异常(例如从 20 突然变为 0 或 1),这并非 while 循环内部计数逻辑失效,而是方法被意外重复调用所致。
关键问题出现在这段测试代码中:
print('(a) Jacobi solution:', p_15.Jacobi_iteration()[0], '\n iteration count:', p_15.Jacobi_iteration()[1])此处 p_15.Jacobi_iteration() 被调用了两次:一次取 [0](解向量),一次取 [1](迭代次数)。每次调用都会重新执行整个 while 循环,并重置 itr = list([]) —— 因此第二次调用从空列表开始计数,最终 len(itr) 极可能为 1(例如首次迭代即满足收敛条件),造成“计数跳变”的假象。
✅ 正确做法是:只调用一次方法,解构返回值复用结果:
立即学习“Python免费学习笔记(深入)”;
result = p_15.Jacobi_iteration()
solution, iterations = result[0], result[1] # 或直接解包:solution, iterations = p_15.Jacobi_iteration()
print('(a) Jacobi solution:', solution, '\n iteration count:', iterations)更推荐使用元组解包提升可读性:
solution, iters = p_15.Jacobi_iteration()
print('(a) Jacobi solution:', solution, '\n iteration count:', iters)⚠️ 注意事项:
- Jacobi_iteration() 和 gssSeidel_iteration() 均为有状态、无缓存的纯计算方法:每次调用都从初始解 self.ini 重新开始迭代,不共享中间状态;
- 若需多次访问结果(如同时打印解、迭代次数、收敛误差等),务必避免重复调用;
- 可进一步优化:将 acc_test 方法中的 math.log10(2) 提前计算为常量,避免循环内重复调用;scarborough 中对零值的保护建议改用 np.finfo(float).tiny 替代硬编码 0.00001,增强数值鲁棒性;
- copy.deepcopy 在密集迭代中开销较大,若 curr_sol/next_sol 仅为 NumPy 数组,优先使用 .copy() 或 np.copy() 替代。
总结:while 计数异常往往不是循环本身的问题,而是方法调用方式引发的逻辑误判。养成“一次调用、多次使用”的习惯,既是性能优化,更是避免隐蔽 Bug 的关键实践。


















