昨晚熬大夜改代码,那个新加的功能死活跑不通,控制台啪地甩出来一句「IndexError: list index out of range」,血压顿时拉满了。这玩意就跟走路踩空台阶似的,程序跑着跑着突然就摔个大跟头。
一、眼前一抹黑
当时正吭哧吭哧写个循环处理订单数据,代码逻辑自己觉得特顺溜,结果一跑就报错。盯着控制台那句英文看了三遍,脑子里就剩下俩字:「又来了!」。之前别的项目也栽过这坑,但每次都跟第一次见似的,完全想不起来上次咋解决的。

二、开灯找坑
实在没招,只能把惹事的代码段单独拎出来,开了调试器一步一步跟。数据是个列表,我抄起len()先把它长度打印出来——好家伙,明明只有5条数据,我非得用循环去取第6个位置!这不跟餐厅明明只有5个座位,非要服务员给你安排第6桌的客人一样离谱吗?
再细看循环条件,简直想抽自己:for i in range(1, len(orders)+1): 这+1手抖加的!Python列表明明是从0开始数数的,非要从1循环到长度+1,这不是逼着程序去抓不存在的第六个元素嘛跟让服务员凭空变把椅子有啥区别?

三、抡起锤子补坑
赶紧把循环改成range(len(orders))。跑一遍——呵,这回不报错了!但数据对不上号?仔细一瞅,订单列表的第一个数据被循环跳过去了,直接从第二个开始处理。得,这就是range(0)和range(1)搞反的后遗症。
老实用最朴素的写法:for i in range(0, len(orders)): 终于看到控制台哗哗吐出完整的数据流,那一刻感觉自己像个刚学会骑自行车的小孩儿,又菜又兴奋。
四、给坑插个警示牌
顺手打开项目文档本,抄起红笔加粗写上三条:
- 动循环之前先len():跟做饭前看冰箱剩几颗菜一个道理
- range()终点别手欠+1:数组一位是len-1,背不下来就写手上
- 下标从0数!0!0!:当年数学考满分也没用,编程界就认0开头
关电脑前把这段报错截图贴文档里,旁边用50号字标上:「再栽这坑就去跑操场十圈」。这种低级错误犯一次是意外,犯两次就是存心给凌晨三点的自己找罪受了。

