Python技术迷

python面试题:列表的sort方法与sorted函数都可以对列表排序,有何区别?

说到 Python 的排序,我第一反应就是两个老熟人——list.sort() 和 sorted(),两个名字看上去差不多的家伙,结果能用错的人还不少。

我一直觉得这俩工具就像两个开车技术不同的老司机:一个专心修车(修改原列表),一个开共享车(创建新列表)。今天咱们就来盘盘它们的区别,以及怎么用最合适。

1. list.sort() 和 sorted() 是啥?

list.sort()

这个方法是列表对象自带的,直接对列表对象“下手”。你喊一声,它立马原地排队,连列表本尊的顺序都改了。可以这么理解,list.sort() 是个“原地排序”操作。

nums = [3, 1, 4, 1, 5, 9]
nums.sort()
print(nums)  # 输出:[1, 1, 3, 4, 5, 9]

用完以后,nums 自己变成了排好序的模样。是不是很直接?不过,这玩意儿只能对列表用,其他类型对象比如元组、字符串啥的,一律不给面子。

sorted()

相比之下,sorted() 更像一个外部工具人。你给它点活,它帮你干完了,再把结果交还给你。更重要的是,它不会改动原列表,而是创建一个新列表,把排序结果打包好送回来。

nums = [3, 1, 4, 1, 5, 9]
new_nums = sorted(nums)
print(new_nums)  # 输出:[1, 1, 3, 4, 5, 9]
print(nums)      # 原列表不变:[3, 1, 4, 1, 5, 9]

而且它还贼灵活,不止能搞列表,元组、字符串甚至字典的键啥的都能玩。

print(sorted((3, 1, 4)))  # 输出:[1, 3, 4]
print(sorted("python"))   # 输出:['h', 'n', 'o', 'p', 't', 'y']

2. 两者的主要区别

2.1 修改原数据 vs 生成新数据

  • **list.sort()**:修改列表本身,操作的是列表这个“实体”。
  • **sorted()**:不动原列表,生成一个新的有序列表。

这就好比你买了一台电脑,list.sort() 是直接把硬盘格式化重装系统;sorted() 则像装个虚拟机,真实硬盘一点儿没动。

2.2 返回值

  • **list.sort()**:返回值是 None,因为它干完活就没别的了。
  • **sorted()**:返回值是排序后的新列表。

想拿排序后的数据直接用,sorted() 更方便:

nums = [7, 2, 9]
result = nums.sort()  # result 是 None,啥都不能干
new_result = sorted(nums)  # result 是新列表,可直接用

2.3 使用场景

  • 如果你确定需要修改原列表:用 list.sort()。
  • 如果你还想留着原列表做别的事:用 sorted()。

3. 排序的高级玩法

3.1 关键字参数 key

无论是 list.sort() 还是 sorted(),都支持一个叫 key 的参数。这个参数可以指定一个函数,告诉它按照啥规则排序。

比如按字符串长度排序:

words = ["apple", "banana", "kiwi", "grape"]
words.sort(key=len)
print(words)  # 输出:['kiwi', 'grape', 'apple', 'banana']

或者用 sorted() 也行:

words = ["apple", "banana", "kiwi", "grape"]
new_words = sorted(words, key=len)
print(new_words)  # 输出:['kiwi', 'grape', 'apple', 'banana']

注意点:key 是指定的规则,不能直接写判断条件。比如下面这种写法就会炸:

words.sort(key=len > 5)  # ❌ 错误示例

3.2 倒序排序

给参数 reverse=True,立马翻转排序顺序:

nums = [3, 1, 4, 1, 5, 9]
nums.sort(reverse=True)
print(nums)  # 输出:[9, 5, 4, 3, 1, 1]

或者用 sorted():

nums = [3, 1, 4, 1, 5, 9]
new_nums = sorted(nums, reverse=True)
print(new_nums)  # 输出:[9, 5, 4, 3, 1, 1]

4. list.sort() 和 sorted() 的性能对比

有人可能会问,两个方法的性能有没有啥区别?答案是——在大多数情况下,差不多。

两者的核心排序算法都是 Timsort,一种稳定且高效的排序算法。除非你的场景特别特殊,比如对超大规模列表排序,否则不需要为性能纠结,选最合适的工具用就行。

不过要注意,list.sort() 直接改原列表,少了一步新列表创建的开销,理论上会稍微快点,但差别一般可以忽略。

5. 一些坑和注意事项

坑 1:list.sort() 没有返回值

直接上代码演示啥叫“白忙活”:

nums = [3, 1, 4]
sorted_nums = nums.sort()  # 坑点!返回值是 None
print(sorted_nums)  # 输出:None

如果你用了 list.sort(),记住别试图从它的返回值里拿排序后的列表,直接用原列表就行。

坑 2:sorted() 创建新对象占用内存

如果你的列表超级大,用 sorted() 可能会消耗更多内存,特别是当你同时保留原列表和新列表的时候。

两者的选择说到底就一个逻辑:**想改原列表就用 list.sort(),想留住原列表就用 sorted()**。就像选择直接修 Bug 还是写个分支再测试,工具没对错,合适才最重要。

最后,还是那句话:代码少踩坑,面试稳如松,祝大家都能在 Python 面试中稳拿 Offer!

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。

对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
🔥虎哥私藏精品 热门推荐🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。

资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB,全部免费领取。