运行代码时为何出现"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四个索引,但列表长度在不断缩短:- 初始
possible有4个元素(dia_5、dia_14、row_2、col_2) - 第一次
pop(0)后,列表剩3个元素,原索引1、2、3的元素现在索引为0、1、2 - 第二次
pop(1)后,列表剩2个元素,原索引2的元素现在索引为0,原索引3的元素现在索引为1 - 第三次循环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
相关产品推荐
相关产品推荐

