Python嵌套循环中矩阵值更新变量异常问题求助
问题
在矩阵插值操作中遇到嵌套循环逻辑错误:当行索引i能被10整除时,需要将ends1和ends2更新为i-10和i,但进入else分支时这两个变量未按预期保留更新后的值。仅当输入为11、21这类10n+1的数值时逻辑暂时有效,输入21时,到达(10,0)位置后ends1仍为0,不符合预期。
原代码如下:
import time # 原代码遗漏该导入,补充后才能正常运行 inputs = int(input ('Enter number of rows and columns: ')) n = inputs m = inputs start_time = time.time() Matrix = [[0 for x in range(n)] for y in range(m)] #populate coordinates divisible by 10 def terrain_inter(M): #populate vertical coordinates that are aligned with those coordinates are divisible by 10 for i in range(len(M)): ends1 = 0 ends2 = 10 for j in range (len(M)): if i == 0: continue elif i % 10 == 0: ends1 = i - 10 ends2 = i print(ends2) else: print(ends1) M[i][j] = M[ends1][j] + ((i-ends1)/(ends2 - ends1)) * (M[ends2][j] - M[ends1][j]) M[i][j] = round(M[i][j],2) for row in M: print(*row) terrain_inter(Matrix)
问题分析与修复
错误根源
核心问题是**ends1和ends2被定义在for i循环内部**,导致每轮i迭代都会重新初始化这两个变量为0和10。比如i=10时虽然更新了变量值,但进入i=11的循环时,变量又被重置回初始状态,无法保留上一次的更新结果。
修复后的代码
import time inputs = int(input('Enter number of rows and columns: ')) n = inputs m = inputs start_time = time.time() # 给10的倍数行设置测试值,方便验证插值效果 Matrix = [[0 for x in range(n)] for y in range(m)] for j in range(n): Matrix[10][j] = 1 Matrix[20][j] = 2 def terrain_inter(M): # 将区间变量移到外层循环外,保留跨i迭代的状态 ends1 = 0 ends2 = 10 for i in range(len(M)): for j in range(len(M)): if i == 0: continue elif i % 10 == 0: ends1 = i - 10 ends2 = i print(f"更新插值区间: ends1={ends1}, ends2={ends2}") else: print(f"当前使用区间: ends1={ends1}, ends2={ends2}") # 执行线性插值计算 M[i][j] = M[ends1][j] + ((i - ends1)/(ends2 - ends1)) * (M[ends2][j] - M[ends1][j]) M[i][j] = round(M[i][j], 2) for row in M: print(*row) terrain_inter(Matrix)
关键改动说明
- 调整变量作用域:把
ends1和ends2移到for i循环外部,确保它们的值在不同i的迭代中持续保留,不会被重复初始化。 - 补充测试数据:给10、20行设置具体数值,避免原代码全0矩阵插值结果无意义的问题,方便直观验证逻辑正确性。
- 优化调试信息:打印当前使用的区间值,便于观察变量状态是否符合预期。
修改后,输入21时:i=10会更新区间为ends1=0、ends2=10,i=11到i=19都会用这个区间插值;i=20时更新区间为ends1=10、ends2=20,i=21会使用新区间计算,完全符合预期逻辑。
内容的提问来源于stack exchange,提问作者honj - t
相关产品推荐
相关产品推荐

