所有东西都比None大吗?
除了 None
之外,Python 有没有其他内置的数据类型,满足以下条件:
>>> not foo > None
True
这里的 foo
是这种类型的一个值。那 Python 3 呢?
2 个回答
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;
...
}
编辑:添加了版本号。
97
None
在 Python 2 中总是比任何数据类型都小(可以查看 object.c
)。
在 Python 3 中,这个规则发生了变化;现在如果对没有合理自然顺序的东西进行比较,就会出现 TypeError
错误。根据 3.0 的更新说明:
Python 3.0 简化了排序比较的规则:
当比较的对象没有有意义的自然顺序时,排序比较运算符(
<
,<=
,>=
,>
)会引发TypeError
错误。因此,像1 < ''
、0 > None
或len <= len
这样的表达式不再有效,比如None < None
会引发TypeError
,而不是返回False
。这意味着对一个包含不同类型元素的列表进行排序就没有意义了——所有元素必须可以相互比较。需要注意的是,这个规则不适用于==
和!=
运算符:不同类型的对象总是被认为是不相等的。
这让一些人感到不满,因为在 Python 2 中,像对包含一些 None
值的列表进行排序,并让 None
值聚集在一起的做法很方便。之前在邮件列表上有讨论过这个问题,但最终的观点是,Python 3 尝试避免对排序做出任意的决定(这在 Python 2 中经常发生)。