Python选择排序代码运行报IndexError:pop索引越界问题
报错原因
- 核心问题出在
find_smallest函数的返回值错误:函数注释明确说明需要返回最小值对应的索引,实际代码最后返回的是最小值本身smallest,而非提前定义好的索引变量smallest_index。 - 列表的
pop()方法要求传入的参数是待删除元素的索引位置,传入元素值会导致逻辑完全错乱:- 首次运行传入测试数组
[5, 3, 6, 2, 10]时,find_smallest返回最小值2,arr.pop(2)实际删除的是索引为2的元素6,而非值为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
相关产品推荐
相关产品推荐

