list.sort()就地修改原列表且无返回值,sorted()返回新列表并保持原数据不变;二者均支持key和reverse参数,但key必须传函数而非调用结果,且每次比较都会执行key函数。

list.sort() 会改原列表,sorted() 返回新列表
这是最根本的区别:一个就地修改,一个不碰原始数据。如果你后续还要用原来的顺序,用 list.sort() 就等于把底牌烧了。
常见错误现象:my_list.sort(); print(my_list) 没问题,但 new_list = my_list.sort() 后 new_list 是 None——因为 sort() 无返回值。
-
sorted()总是返回新列表,原列表不动,适合链式操作或保留原始数据 -
list.sort()只适用于你明确想改变原列表的场景,比如内存敏感、只用一次的中间处理 - 两者都支持
key和reverse参数,行为一致
key 参数要传函数,不是函数调用结果
写 key=str.lower 对,写 key=str.lower() 错——后者立刻执行并传回 None,直接报 TypeError: 'NoneType' object is not callable。
使用场景:按字符串忽略大小写排序、按字典某个字段、按路径后缀、按日期字符串解析结果等。
立即学习“Python免费学习笔记(深入)”;
- 常见错误:写成
key=len(my_str)或key=my_list[0],都是试图传值而非传可调用对象 - 匿名函数够用时优先用
lambda,比如sorted(data, key=lambda x: x['age']) - 性能影响:每次比较都会调用
key函数,如果逻辑重(如正则匹配、IO),考虑预计算字段再排序
reverse=True 不等于降序排列所有情况
reverse=True 只是把默认升序结果倒过来,它不改变 key 映射后的比较逻辑。对复杂 key,这容易出人意料。
比如按绝对值排序:sorted([-5, 3, -1], key=abs) 得 [-1, 3, -5];加 reverse=True 得 [-5, 3, -1],不是按“绝对值降序”,而是按 [1, 3, 5] 倒序后对应原元素的顺序。
- 真正需要“按 key 降序”,应写
key=lambda x: -abs(x)或用reverse=False配合负号 - 字符串默认按 Unicode 码点排,
reverse=True后不是“字典倒序”,而是码点倒序,中文可能乱 - 浮点数含
nan时,sorted([1.0, float('nan'), 2.0])结果不确定,reverse更难预测
sorted() 能排任意可迭代对象,list.sort() 只能用于 list
sorted() 接收任何可迭代对象(tuple、set、生成器、dict_keys),统一转成 list 返回;list.sort() 是 list 类型独有方法,对 tuple 或 range 调用直接报 AttributeError。
使用场景:快速把字典按键排序 sorted(my_dict),或把文件行去重后排序 sorted(set(f))。
- 生成器传给
sorted()会被一次性耗尽,注意内存;大文件别直接sorted(line for line in f) -
tuple不能调sort(),但sorted(my_tuple)没问题,返回的是list,不是tuple - Python 3.11+ 对
sorted()做了 Timsort 优化,小数据差异不大,但上万元素时比手写循环 + append 快不少
key 函数的执行时机和次数——它在每次比较前都调,不是只调一次预处理。










