You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键改动说明

  1. 调整变量作用域:把ends1和ends2移到for i循环外部,确保它们的值在不同i的迭代中持续保留,不会被重复初始化。
  2. 补充测试数据:给10、20行设置具体数值,避免原代码全0矩阵插值结果无意义的问题,方便直观验证逻辑正确性。
  3. 优化调试信息:打印当前使用的区间值,便于观察变量状态是否符合预期。

修改后,输入21时:i=10会更新区间为ends1=0、ends2=10,i=11到i=19都会用这个区间插值;i=20时更新区间为ends1=10、ends2=20,i=21会使用新区间计算,完全符合预期逻辑。

内容的提问来源于stack exchange,提问作者honj - t

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 07:42:36