Python中deque触发IndexError索引越界的原因及解决方法
解决IndexError: deque index out of range问题
嘿,我一眼就瞅到你代码里的问题了——你在索引list_id的时候搞混了对象,直接导致了越界错误。咱们拆解下问题根源:
错误原因
当你执行k = de_list_id.popleft()时,k已经是你当初放进deque里的索引值(比如你说的1到list_id长度的数值)。但你后续却用de_list_id[k]来取list_id的元素,这完全是画蛇添足:
- 执行
popleft()之后,de_list_id的长度已经减少了1,这时候如果k大于等于当前de_list_id的长度,直接就会触发IndexError - 就算没触发错误,
de_list_id[k]取到的也不是你要的list_id对应元素,逻辑完全错了
修复代码
你只需要直接用k去索引list_id就行,不需要绕de_list_id这一圈:
from collections import deque # 先确保de_list_id是正确的索引队列(注意Python列表索引从0开始) de_list_id = deque(range(len(list_id))) # 生成0到len(list_id)-1的索引,避免越界 while de_list_id: k = de_list_id.popleft() # 取出队列头部的索引 current_id = list_id[k] # 直接用k获取目标ID status = check(arg1, arg2, current_id, arg3) if status: dl_routine(arg1, arg2, current_id, arg3) # 在线则执行下载 else: de_list_id.append(k) # 不在线则重新放回队列末尾,等待下次检查
额外提醒
如果你当初创建de_list_id是从1开始的(比如deque(range(1, len(list_id)+1))),那就算修复了上面的问题,list_id[k]还是会触发越界——因为Python列表的索引是从0开始的,最大索引是len(list_id)-1。所以一定要确保de_list_id里存的是0到len(list_id)-1的数值。
内容的提问来源于stack exchange,提问作者Corbjn
相关产品推荐
相关产品推荐

