75

除了 之外None,是否还有 Python 内置数据类型:

>>> not foo > None
True

foo该类型的值在哪里?Python 3 怎么样?

4

2 回答 2

95

None总是小于 Python 2 中的任何数据类型(请参阅 参考资料object.c)。

在 Python 3 中,这发生了变化;现在对没有合理自然排序的事物进行比较会得到 a TypeError。从3.0“新功能”更新

Python 3.0 简化了排序比较的规则:

当操作数没有有意义的自然排序时,排序比较运算符 ( <, <=, >=, >) 会引发异常。因此,诸如:或or之类的TypeError表达式不再有效,例如raises而不是返回。一个推论是对异构列表进行排序不再有意义——所有元素必须相互可比。请注意,这不适用于and运算符:不同类型的对象总是比较不相等。1 < ''0 > Nonelen <= lenNone < NoneTypeErrorFalse==!=

这让一些人感到不安,因为这样做通常很方便,例如对包含一些None值的列表进行排序,并使这些None值在开始或结束时聚集在一起。不久前,邮件列表上有一个关于此的线程,但最终的一点是 Python 3 试图避免对排序做出任意决定(这在 Python 2 中经常发生)。

于 2010-02-06T18:38:29.877 回答
30

来自 Python 2.7.5源代码 ( object.c):

static int
default_3way_compare(PyObject *v, PyObject *w)
{
    ...
    /* None is smaller than anything */
    if (v == Py_None)
            return -1;
    if (w == Py_None)
            return 1;
    ...
}

编辑:添加版本号。

于 2010-02-06T18:40:12.903 回答