You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行代码时为何出现"pop index out of range"错误?

Python列表循环pop时触发"pop index out of range"错误的原因与解决

我在为数学游戏"Dandelions"编写机器人代码,需要收集所有包含数字1的行、列和对角线存入possible列表。但在最后用for循环拆分该列表时,出现了"pop index out of range"错误——单独运行每个索引值时没问题,但循环即使设为range(3)仍报错,且仅能输出索引0和2的内容。

代码如下:

row_1 = [0, 0, 0, 0, 0]
row_2 = [0, 1, 0, 0, 0]
row_3 = [0, 0, 0, 0, 0]
row_4 = [0, 0, 0, 0, 0]
row_5 = [0, 0, 0, 0, 0]

col_1 = [0, 0, 0, 0, 0]
col_2 = [0, 0, 1, 0, 0]
col_3 = [0, 0, 0, 0, 0]
col_4 = [0, 0, 0, 0, 0]
col_5 = [0, 0, 0, 0, 0]

#diagonals 1-9 go from left to right, while diagonals 10-18 go from right to left

dia_1 = [0]
dia_2 = [0, 0]
dia_3 = [0, 0, 0]
dia_4 = [0, 0, 0, 0]
dia_5 = [0, 0, 0, 1, 0]
dia_6 = [0, 0, 0, 0,]
dia_7 = [0, 0, 0]
dia_8 = [0, 0]
dia_9 = [0]

dia_10 = [0]
dia_11 = [0, 0]
dia_12 = [0, 0, 0]
dia_13 = [0, 0, 0, 0]
dia_14 = [0, 0, 0, 0, 1]
dia_15 = [0, 0, 0, 0,]
dia_16 = [0, 0, 0]
dia_17 = [0, 0]
dia_18 = [0]

dia = [dia_1, dia_2, dia_3, dia_4, dia_5, dia_6,
       dia_7, dia_8, dia_9, dia_10, dia_11, dia_12,
       dia_13, dia_14, dia_15, dia_16, dia_17, dia_18]
row = [row_1, row_2, row_3, row_4, row_5]
col = [col_1, col_2, col_3, col_4, col_5]
possible = []

for i in dia:
    if 1 in i:
        possible.append(i)

for i in row:
    if 1 in i:
        possible.append(i)

for i in col:
    if 1 in i:
        possible.append(i)

for i in range(0, 4):
    print(possible.pop(i))

错误原因

问题出在pop(i)的特性和循环索引的冲突:

  • 每次调用pop(i)会从列表中移除对应索引的元素,列表长度会减1,后续元素的索引会自动左移一位。
  • 你的循环用range(0,4)固定生成0、1、2、3四个索引,但列表长度在不断缩短:
    1. 初始possible有4个元素(dia_5、dia_14、row_2、col_2)
    2. 第一次pop(0)后,列表剩3个元素,原索引1、2、3的元素现在索引为0、1、2
    3. 第二次pop(1)后,列表剩2个元素,原索引2的元素现在索引为0,原索引3的元素现在索引为1
    4. 第三次循环i=2,此时列表只有2个元素,最大索引是1,调用pop(2)就会触发"index out of range"错误

解决方法

根据需求选择以下任意一种方案:

方案1:倒序pop(不打乱原顺序的打印)

从最后一个元素开始pop,这样前面元素的索引不会被后续操作影响:

for i in range(len(possible)-1, -1, -1):
    print(possible.pop(i))

方案2:循环pop第一个元素(顺序打印)

如果不需要保留原列表,直接循环pop索引0直到列表为空:

while possible:
    print(possible.pop(0))

方案3:直接遍历打印(不修改原列表)

如果不需要删除possible中的元素,直接遍历打印更简单高效:

for item in possible:
    print(item)

内容的提问来源于stack exchange,提问作者Jackson Vliet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:36:28