不规则数组访问需先检查行索引i<len(arr),再检查列索引j<len(arr[i]),避免用len(arr[0])作统一假设;推荐用safe_get_2d封装、迭代遍历或提前校验结构。

不规则数组(如嵌套列表、 jagged array)没有统一的行列结构,直接按二维方式访问极易触发 IndexError。关键不是“能不能用 try-except”,而是从访问逻辑本身堵住漏洞。
明确每个维度的实际长度
不规则数组的每一行长度可能不同,不能假设 len(arr[0]) 适用于所有行。每次访问前都应单独检查当前行长度。
- 访问第
i行第j列前,先确认i < len(arr) - 再确认
j < len(arr[i]),而不是j < len(arr[0]) - 对空行要额外判断:
if not arr[i]: continue或抛出语义化提示
用安全索引函数封装访问逻辑
把边界检查抽成可复用的小函数,避免重复写条件判断。
- Python 示例:
def safe_get_2d(arr, i, j, default=None):
if i < 0 or i >= len(arr):
return default
row = arr[i]
if not isinstance(row, (list, tuple)):
return default
if j < 0 or j >= len(row):
return default
return row[j]
- 调用时直接写
safe_get_2d(data, 2, 5),无需在业务逻辑里夹杂一堆if
优先使用迭代而非下标遍历
如果目标是处理全部元素,用 for row in arr: 和 for item in row: 完全避开索引计算。
- 避免写
for i in range(len(arr)):再套for j in range(len(arr[i])): - 需要索引信息时,改用
enumerate:for i, row in enumerate(arr):,再for j, val in enumerate(row): - 这样既清晰又天然规避越界,尤其适合数据结构本身就不规整的场景
提前标准化或拒绝非法结构
若业务允许,可在数据进入核心逻辑前做一次结构校验。
- 例如要求“每行必须是非空列表”,则加载后立即检查:
all(isinstance(r, list) and r for r in arr) - 不符合就早报错,而不是等到某次
arr[7][12]才崩 - 也可选择填充默认值转为规则数组(如用
None补齐短行),但需评估内存与语义代价

















