所有东西都比None大吗?

76 投票
2 回答
20056 浏览
提问于 2025-04-15 18:58

除了 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 > Nonelen <= len 这样的表达式不再有效,比如 None < None 会引发 TypeError,而不是返回 False。这意味着对一个包含不同类型元素的列表进行排序就没有意义了——所有元素必须可以相互比较。需要注意的是,这个规则不适用于 ==!= 运算符:不同类型的对象总是被认为是不相等的。

这让一些人感到不满,因为在 Python 2 中,像对包含一些 None 值的列表进行排序,并让 None 值聚集在一起的做法很方便。之前在邮件列表上有讨论过这个问题,但最终的观点是,Python 3 尝试避免对排序做出任意的决定(这在 Python 2 中经常发生)。

撰写回答