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

Python选择排序代码运行报IndexError:pop索引越界问题

报错原因
  • 核心问题出在find_smallest函数的返回值错误:函数注释明确说明需要返回最小值对应的索引,实际代码最后返回的是最小值本身smallest,而非提前定义好的索引变量smallest_index。
  • 列表的pop()方法要求传入的参数是待删除元素的索引位置,传入元素值会导致逻辑完全错乱:
    1. 首次运行传入测试数组[5, 3, 6, 2, 10]时,find_smallest返回最小值2,arr.pop(2)实际删除的是索引为2的元素6,而非值为2的元素
    2. 多轮循环后数组长度不断缩短,当某次find_smallest返回的最小值大于当前数组的最大合法索引时,就会触发IndexError: pop index out of range报错。
      以提供的测试用例为例,第三次循环时原数组已经被删得只剩[5,3,10],最大合法索引为2,此时find_smallest返回最小值3,传入pop(3)会直接触发索引越界。
修复方案

仅需修改find_smallest函数的最后一行返回逻辑,将返回最小值改为返回最小值对应的索引即可,其余代码无需调整。
修复后的完整代码:

def find_smallest(arr):
    # 存储最小值
    smallest = arr[0]
    # 存储最小值对应的索引
    smallest_index = 0
    for i in range(1, len(arr)):
        if arr[i] < smallest:
            smallest = arr[i]
            smallest_index = i
    # 修复:返回最小值索引而非最小值本身
    return smallest_index

# 选择排序实现
def selection_sort(arr):
    new_arr = []
    for i in range(len(arr)):
        # 找到当前数组最小元素的索引,弹出元素加入新数组
        smallest_index = find_smallest(arr)
        new_arr.append(arr.pop(smallest_index))
    return new_arr

print(selection_sort([5, 3, 6, 2, 10]))

运行上述代码将输出正确升序排序结果:[2, 3, 5, 6, 10]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:51:26