
在遍历列表时直接使用 `i+1` 访问后续元素易导致 `indexerror: list index out of range`,根本原因是未校验索引是否超出列表边界。正确做法是在访问前显式判断 `i + 1
当你需要在循环中比较当前元素与下一个元素(例如统计相邻配对、计算差分、实现滑动逻辑)时,一个常见误区是假设 i+1 总是有效索引。但当 i 达到 len(list) - 1(即最后一个有效下标)时,i+1 就等于 len(list),已超出合法范围(Python 列表索引为 0 到 len(list)-1),从而触发运行时错误。
在你提供的代码中,问题集中在以下两处:
if cInt1[i+1] == 1: # 当 i == C-1 时,i+1 == C → 越界!
counter -= 1
if cInt2[i+1] == 1: # 同样,i == C-1 时越界
counter -= 1✅ 正确修复方式:始终前置边界检查
将 cInt1[i+1] == 1 改为 i + 1
修正后的核心循环如下:
for i in range(C):
if cInt1[i] == 1:
counter += 3
if i + 1 < len(cInt1) and cInt1[i+1] == 1: # ✅ 安全访问
counter -= 1
else:
print("hi")
for i in range(C):
if cInt2[i] == 1:
counter += 3
if i + 1 < len(cInt2) and cInt2[i+1] == 1: # ✅ 安全访问
counter -= 1
# 注意:第三个循环存在逻辑冗余(cInt2[i] == 1 and cInt2[i] == 1 等价于单个判断)
# 且步长为2,仍需检查 i+1 是否越界(若用于相邻判断),但当前写法无越界风险(仅用 cInt2[i])⚠️ 额外建议与注意事项
-
更优雅的遍历方式:若目标是处理所有相邻对 (cInt1[i], cInt1[i+1]),推荐使用 range(len(cInt1) - 1) 替代 range(C),从源头排除越界可能:
for i in range(len(cInt1) - 1): if cInt1[i] == 1: counter += 3 if cInt1[i+1] == 1: counter -= 1 - 避免硬编码 C:C 是输入长度,但列表实际长度由 input().split() 决定。应统一使用 len(cInt1) 和 len(cInt2),增强鲁棒性。
- 调试技巧:遇到越界错误,可临时添加 print(f"i={i}, len={len(cInt1)}") 快速定位临界点。
通过前置索引校验或调整遍历范围,即可彻底解决“Index out of range”问题,让代码既健壮又可读。










