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高级架构师资料合集》。