一切都比无?

时间:2010-02-06 18:32:17

标签: python python-3.x python-datamodel

是否存在Python内置数据类型 None ,其中包含:

>>> not foo > None
True

其中foo是该类型的值? Python 3怎么样?

2 个答案:

答案 0 :(得分:76)

None总是小于Python 2中的任何数据类型(参见object.c)。

在Python 3中,这被改变了;现在在没有合理自然排序的情况下对事物进行比较会产生TypeError。来自 3.0 "what's new" updates

  

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

     

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

这会使一些人感到不安,因为对它进行排序时,通常会很方便地对其中包含None个值的列表进行排序,并使None值在开头或结尾处聚集在一起。一段时间后 There was a thread on the mailing list about this ,但最终的一点是Python 3试图避免对排序做出任意决定(这在Python 2中发生了很多)。

答案 1 :(得分:27)

来自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;
    ...
}

编辑:添加了版本号。