sort是列表原地排序方法,仅适用于列表且修改原列表;sorted是内置函数,支持任意可迭代对象,返回新列表而不改变原对象。

sort 是列表对象的原地方法,只适用于列表;sorted 是内置函数,可处理任意可迭代对象,且返回新列表。
作用对象与适用范围不同
sort 只能被列表(list)调用,是 list 类的实例方法,其他类型如元组、字符串、集合调用会报 AttributeError。而 sorted 接收任意可迭代对象(list、tuple、str、dict、set、生成器等),统一返回一个新列表。
- ✅ 正确:[3,1,2].sort()|sorted((3,1,2))|sorted("bac")|sorted({1:'a', 3:'c', 2:'b'})
- ❌ 错误:(3,1,2).sort()|"abc".sort()|sorted(42)(42 不可迭代)
是否修改原数据
sort 直接修改调用它的列表,不返回新列表(实际返回 None),属于“原地排序”;sorted 总是创建并返回一个新列表,原始对象完全不变。
- a = [3,1,2]; a.sort(); → a 变为 [1,2,3],表达式结果为 None
- b = [3,1,2]; c = sorted(b); → b 仍是 [3,1,2],c 是新列表 [1,2,3]
参数完全一致,但语义使用场景有差异
两者都支持 key、reverse 参数,行为完全相同。但因 sort 不返回值,链式调用会出错;sorted 返回列表,可直接用于后续操作。
立即学习“Python免费学习笔记(深入)”;
- sorted(words, key=str.lower, reverse=True) ✅ 可读性强,适合管道式写法
- words.sort(key=str.lower); words.reverse() ❌ 等价但分两步,且无法嵌入表达式
- max(sorted(data, key=abs)) ✅ 一行获取绝对值最大元素
性能与内存开销对比
sort 因不创建新对象,空间复杂度 O(1),速度略快;sorted 需分配新列表空间,空间复杂度 O(n),但对小数据几乎无感。若需保留原序或处理不可变对象,必须用 sorted;若确定只需排序一次且不关心原列表,sort 更轻量。
- 大数据量且内存敏感 → 优先 sort(前提是能用列表)
- 需要原列表参与后续逻辑,或输入是 tuple/str/dict → 只能用 sorted
- 函数式编程风格、嵌套表达式、lambda 链式处理 → sorted 更自然










