Python二维网格随机出现索引越界问题求助
二维网格遍历的索引越界问题定位
问题背景
基于用户输入的行列数创建可变二维网格,但在遍历网格时,相同输入参数下有时正常运行,有时抛出list index out of range错误。
相关代码
创建网格的代码:
rows, cols = (rowSize, columnSize) # creating 2d lists grid = [[random.randint(10, 99) for i in range(cols)] for j in range(rows)]
遍历网格的代码:
for i in range(0, cols-1): for j in range(0, rows-1): if random.randint(0, 10) == 0: grid[i][j] = ''
问题原因
网格结构与索引不匹配:
创建网格时,grid是行优先结构:外层循环range(rows)生成rows个行元素,每个行元素包含cols个列元素。因此grid的合法索引为grid[行索引][列索引],行索引范围是0 ~ rows-1,列索引范围是0 ~ cols-1。遍历逻辑的索引错误:
遍历代码中,外层循环i的范围是0 ~ cols-2,内层循环j的范围是0 ~ rows-2,却用grid[i][j]访问元素。当cols > rows时,i的取值会超出grid的行索引范围(比如rows=3、cols=5时,i可能取到3、4,而grid仅存在0、1、2三个行索引)。随机性导致偶发错误:
只有当random.randint(0,10) == 0时才会执行grid[i][j] = '',所以当i超出合法行索引且刚好触发该随机条件时,才会抛出索引越界错误;未触发随机条件时不会执行赋值操作,因此不会报错,这就造成了相同参数下时好时坏的现象。
修复方案
修正遍历逻辑的索引对应关系,确保行索引和列索引匹配网格结构:
# 遍历所有行和列(按需调整范围) for j in range(rows): for i in range(cols): if random.randint(0, 10) == 0: grid[j][i] = ''
如果原本的遍历需求是忽略最后一行和最后一列,可调整为:
for j in range(rows - 1): for i in range(cols - 1): if random.randint(0, 10) == 0: grid[j][i] = ''
内容的提问来源于stack exchange,提问作者SecretGuy
相关产品推荐
相关产品推荐

