一切都比None大吗?

75

除了None以外,是否存在Python内置的数据类型,满足以下条件:

>>> not foo > None
True

如果foo是那种类型的值怎么办?Python 3呢?


请参考以下内容(非重复信息):https://dev59.com/wXA75IYBdhLWcg3weZDu - Karl Knechtel
2个回答

97
在Python 2中,None始终小于任何数据类型(参见object.c)。
在Python 3中,这种行为发生了改变。现在,对于没有明确自然顺序的比较,会导致引发TypeError异常。从Python 3.0的“新特性”更新中可以看到:
Python 3.0简化了有关排序比较的规则:
当操作数没有明确定义的自然顺序时,排序比较运算符(<<=>=>)会引发TypeError异常。因此,诸如1 < ''0 > None或者len <= len之类的表达式不再有效,而None < None也将引发TypeError而不是返回False。一个推论是,对于异构列表进行排序不再有意义-所有元素必须可相互比较。请注意,这不适用于==!=运算符:不同类型的不可比较对象始终不相等。

这让一些人感到不满,因为通常需要对一个列表进行排序,而该列表中有一些None值,并且希望这些None值出现在开头或结尾。有一段时间邮件列表上有关于此的讨论,但最终的观点是,Python 3试图避免对排序做出任意决策(这在 Python2 中经常发生)。


1
感谢您澄清Python 3的状态。我记得看过“新特性”页面,但我不记得这个。非常有趣,但确实很有道理... - Attila O.
2
当然,只要清晰明确,对于 None 的排序并不随意。这种毫无必要的不兼容性就是 Python 3 接受速度缓慢的原因。 - Glenn Maynard
14
“明确定义”(明确、明确规定行为的定义)与“任意”(基于自主决定做出的选择)是有区别的。例如,一个人可能很容易地说出“没有比一切更大的东西”,这同样是明确定义的,但仍然是非常任意的。 - John Feminella
1
确实,它非常方便(例如输入合法性检查),允许比较不可比类型之间的差异,并且对我来说,这样的比较似乎总是返回False - 就像将数字与NaN进行比较时一样。不幸的是,情况并非如此(例如,None<0返回True),显然在Python 3中,这是通过禁止这种比较来处理的 - 这确实是一个巨大的“改进”...!;-) - Rolf Bartstra
2
让None小于所有其他值比让它大于所有其他值更不会随意。空字符串排在任何其他字符串之前,“零”排在任何正整数之前,因此直观地,None类型排在任何其他类型之前。 - HorseloverFat
显示剩余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;
    ...
}

编辑: 添加了版本号。


2
这是针对Python 2.x的,我猜对吗? - Tyler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接