Python自定义sort函数调用后原数组为空问题求助
问题根源分析与解决办法
这问题其实是Python里可变对象传参的典型坑——你在自定义的sort函数里直接修改了传入的原数组,导致外部的原列表被清空了。
为什么会这样?
Python里的列表是可变对象,当你把array传给sort函数时,函数参数里的array和你外面定义的array指向的是同一个内存里的列表对象。你在函数循环里执行array.remove(minimum),每一次都会从这个共享的列表里删掉元素,循环结束后原列表自然就空了。
两种调用方式的差异:
- 当你写
array = sort(array)时,虽然函数里把原列表清空了,但之后你把函数返回的res赋值给了变量array,相当于让这个变量指向了新的排序后的列表,所以你看到的结果是正常的,但原来的那个列表对象其实已经是空的了。 - 当你直接调用
sort(array)却不接收返回值时,变量array依然指向原来的那个列表对象,而它已经被函数里的remove操作掏空了,所以print(array)会输出空数组。
怎么解决?
最稳妥的办法是在函数内部操作原数组的副本,而不是直接修改原数组。这样外部的原列表完全不会受到影响:
def sort(array): arr_copy = array.copy() # 创建原数组的副本,后续操作都用这个副本 res = [] for i in range(len(arr_copy)): minimum = arr_copy[0] for j in range(len(arr_copy)): if arr_copy[j] < minimum: minimum = arr_copy[j] arr_copy.remove(minimum) res.append(minimum) return res array = [9, 1, 5, 7, 3, 8, 4, 6, 2, 0] sort(array) print(array) # 现在会输出原数组:[9, 1, 5, 7, 3, 8, 4, 6, 2, 0]
另外,如果你不想改函数,也可以始终用array = sort(array)的方式调用,让变量指向函数返回的排序后列表——不过这种方式会让原列表被清空,只是你看不到而已,还是推荐上面的副本方案更清晰安全。
顺便提一句:Python内置的sorted()函数就是返回新列表,而list.sort()是原地修改原列表,你的自定义函数现在的行为有点混合了两者,所以才容易踩坑~
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

