
在遍历列表时直接使用 `i+1` 访问后继元素会导致“indexerror: list index out of range”,因为当 `i` 为最后一个索引时,`i+1` 超出合法范围;正确做法是在访问前显式检查 `i+1
当你需要在循环中比较当前元素与下一个元素(例如统计相邻的 1 对、计算差分、滑动窗口逻辑等),常见的错误是无条件使用 arr[i+1],而未考虑数组边界。在你的代码中:
for i in range(C):
if cInt1[i] == 1:
counter += 3
if cInt1[i+1] == 1: # ❌ 危险!当 i == C-1 时,i+1 == C → 越界
counter -= 1此时若 i = C-1(即遍历到最后一个索引),cInt1[i+1] 将尝试访问第 C 个元素(索引从 0 开始,合法范围是 0 到 C-1),必然触发 IndexError。
✅ 正确解法:前置边界检查
将 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⚠️ 额外注意:你代码中还存在一处逻辑冗余——第三个循环:
for i in range(0, C, 2):
if cInt2[i] == 1 and cInt2[i] == 1: # ❌ 恒为真(同一变量重复判断),且未用到 i+1
counter -= 1该条件等价于 cInt2[i] == 1,且循环步长为 2,与前后逻辑不一致,建议根据实际需求重审逻辑(例如是否应为 cInt2[i] == 1 and cInt2[i+1] == 1?若如此,仍需加 i+1
? 更优雅的替代方案(进阶推荐):
若目标是遍历所有相邻元素对(即 (0,1), (1,2), ..., (n-2,n-1)),更清晰的方式是直接控制 range 上限:
for i in range(len(cInt1) - 1): # i 最大为 len-2,i+1 最大为 len-1 → 安全
if cInt1[i] == 1:
counter += 3
if cInt1[i+1] == 1:
counter -= 1这种方式从源头规避越界,语义更明确,也无需每次重复写 i+1
✅ 总结:
- 根本原因:i+1 超出列表长度;
- 通用修复:访问前加 i + 1
- 最佳实践:若仅需处理相邻对,用 range(len(lst)-1) 替代 range(len(lst));
- 调试提示:遇到 IndexError,优先检查所有带 +k 或 -k 的索引表达式是否越界。
修复后,输入示例将正确输出 9。










