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

Python对象排序机制解析:未指定key时sorted(lst)的排序依据是什么?

嘿,让我来逐个解答你的问题:

1. Python中对象是如何排序的?

Python里的排序操作(不管是全局的sorted()函数,还是列表自带的.sort()方法),核心逻辑是基于对象的比较规则来工作的,具体分两种情况:

  • 内置类型对象:像int、str、list、tuple这些Python自带的类型,已经内置了成熟的比较逻辑:

    • 数值类型(int、float)按数值大小比较;
    • 字符串按字符的Unicode码点顺序比较;
    • 容器类型(list、tuple)会逐个元素递归比较,直到分出大小。
  • 自定义类对象:如果你自己写的类创建的对象,默认情况下直接排序会报错——因为Python不知道怎么定义两个自定义对象的"大小"关系。这时候你有几种解决方案:

    • 手动实现富比较方法,比如__lt__()(定义"小于"规则)、__eq__()(定义"相等"规则),排序过程主要依赖__lt__方法;
    • 使用functools.total_ordering装饰器,只需要实现__lt__和__eq__,就能自动生成其他比较方法;
    • 最常用的方式:排序时指定key参数,告诉Python用对象的某个属性或者计算后的结果作为排序依据(比如sorted(lst, key=lambda x: x.name))。
2. 未提供key函数时,sorted(lst)会使用对象的哪个属性值进行排序?是哈希值(hash)还是标识(id)?

答案很明确:既不是哈希值,也不是标识(id)。

当你不指定key参数时,Python会直接尝试调用对象的比较方法(比如前面提到的__lt__)来判断对象间的大小关系,完全不会用到hash或者id:

  • 举个直观的例子:排序字符串列表sorted(["zoo", "apple"]),结果是["apple", "zoo"],这个过程是按字符串的Unicode码点比较的,和字符串的hash值、内存地址(id)没有任何关系;
  • 如果你排序自定义类的对象但没实现比较方法,直接调用sorted()会抛出TypeError,比如:
class Item:
    pass

items = [Item(), Item()]
sorted(items)  # 报错:TypeError: '<' not supported between instances of 'Item' and 'Item'

这种情况下Python不会退而求其次用id或hash来排序,而是直接告诉你无法比较。

额外澄清两个误区:

  • 哈希值(hash)是为哈希表(比如dict、set)设计的,用于快速查找,它不保证有序,甚至不同对象可能有相同的hash值,完全不适合作为排序依据;
  • 标识(id)是对象的内存地址,只有当你手动指定key=id或者自己实现了基于id的比较方法时,才会用到它,但这绝对不是默认的排序逻辑。

内容的提问来源于stack exchange,提问作者Paul R

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:15:09