Python递归排序函数返回仅含最后一个值的列表问题求助
问题根因
- 你主函数中打印的是原始输入的liste列表,而非递归函数返回的排序结果。你调用
recSort(liste)时没有接收函数return的result,自然没法直接拿到排序后的内容。 - Python中列表属于可变对象,函数内对传入的列表做的修改会直接作用到原对象上:你代码里
listIn = liste是直接引用而非拷贝,每次递归调用listIn.pop(smallestIndex)都是在删除原列表的元素,递归结束后原列表只会剩下最后一个未被弹出的最大值10,所以主函数打印liste会输出[10]。 - 你困惑的"加print函数就正常"是误解:你函数内部打印的是专门用来存排序结果的
result列表,本身就是正确的,和加不加那行print没有关联。
修复方法
方案1:接收并打印函数返回的排序结果
修改主函数代码即可,不需要改动递归逻辑:
if __name__ == "__main__": liste = [5, 2, 4, 8, 7, 10, 6] # 接收排序后的返回结果 sorted_list = recSort(liste) # 打印排序结果,而非被修改的原列表 print(sorted_list)
方案2:保留原始输入列表不被修改
如果不希望递归过程修改原始的输入列表,在函数开头对传入的列表做拷贝即可,避免直接操作原对象:
def recSort(liste, result=None): # 做列表拷贝,后续修改只作用在副本上,不影响原输入 listIn = liste.copy() length = len(listIn) smallestIndex = smallestListIndex(listIn) # 为避免每次递归都创建新列表,此处初始化中间结果列表 if result is None: result = [] if length == 1: result.append(listIn[smallestIndex]) return result else: result.append(listIn[smallestIndex]) listIn.pop(smallestIndex) length -= 1 # 将中间结果列表传入下一层递归 return recSort(listIn, result)
修改后主函数既可以接收返回值打印排序结果,原liste也会保留初始值不变。
内容的提问来源于stack exchange,提问作者Shin0X
相关产品推荐
相关产品推荐

