是否存在Python内置数据类型 None
,其中包含:
>>> not foo > None
True
其中foo
是该类型的值? Python 3怎么样?
答案 0 :(得分:76)
None
总是小于Python 2中的任何数据类型(参见object.c
)。
在Python 3中,这被改变了;现在在没有合理自然排序的情况下对事物进行比较会产生TypeError
。来自 3.0 "what's new" updates :
Python 3.0简化了排序比较的规则:
当操作数没有有意义的自然时,排序比较运算符(
<
,<=
,>=
,>
)会引发TypeError
异常排序。因此,诸如1 < ''
,0 > None
或len <= 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;
...
}
编辑:添加了版本号。