为什么None是python中最小的?

Jam*_*pam 22 python python-internals

我从python中学到了什么:

None is frequently used to represent the absence of a value

当我放入一个列表并用数字和字符串排序.我得到了以下结果,这意味着它是最小的数字?

相反:

>>> sorted([1, 2, None, 4.5, (-sys.maxint - 1), (sys.maxint - 1), 'abc'], reverse=True)
['abc', 9223372036854775806, 4.5, 2, 1, -9223372036854775808, None]
>>>
Run Code Online (Sandbox Code Playgroud)

正常排序:

>>> sorted([1, 2, None, 4.5, (-sys.maxint - 1), (sys.maxint - 1), 'abc'])
[None, -9223372036854775808, 1, 2, 4.5, 9223372036854775806, 'abc']
>>>
Run Code Online (Sandbox Code Playgroud)

python排序函数如何使用None?

Mar*_*ers 42

在比较不同类型时,CPython 2应用了一些不同的规则:

  • None 首先排序.
  • 数字在其他类型之前出现,并且在它们之间进行数字比较.
  • 其他类型按其类型名称排序,除非它们显式实现比较方法.

此外,某些类型实现自定义排序规则,并且可以拒绝所有排序尝试.例如,当您尝试对它们进行排序时,复数会引发异常,而datetime当您尝试相对于其他类型对它们进行排序时,对象会这样做.

Python参考文档中没有记录这一点; 请参阅默认比较代码object.c.这是一个实现细节,而不是您的代码应该依赖的东西.该比较运算符文件规定:

内置类型的大多数其他对象比较不相等,除非它们是同一个对象; 一个对象被认为是小于还是大于另一个对象的选择是在程序的一次执行中任意但一致地做出的.

目标是在排序混合对象序列时使不同类型之间的比较稳定.

在Python 3中,比较规则已经收紧; 您只能比较明确实现比较的对象.经过多年的经验得出结论,允许任意比较只会导致更多的混乱; 例如,将带有数字的字符串与整数进行比较总会让新手感到困惑.

您的代码会引发异常.

  • @yopy:我认为文档中没有对此的引用.我总是看源代码.我会添加一些参考资料. (2认同)