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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:35:54