一切都大于无吗?


Answers:


90

None总是小于Python 2中的任何数据类型(请参阅参考资料object.c)。

在Python 3中,这已更改;现在在没有合理的自然排序的情况下对事物进行比较会导致结果TypeError。从3.0版“新增功能”更新

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

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

这使某些人感到不安,因为执行诸如对具有一些None值的列表进行排序None并在开始或结束时将这些值聚集在一起的列表等操作通常很方便。邮件列表上有一个关于此的话题,但最终要点是Python 3试图避免对排序做出任意决定(这在Python 2中经常发生)。


1
感谢您阐明Python 3的状态。我记得阅读“新增功能”页面,但我不记得这一页。非常有趣,但确实有道理...
Attila O. 2010年

2
当然,只要明确定义,对None进行排序就没有任何随意性。这种无缘无故的不兼容性是为什么采用Python 3需要这么长时间的原因。
格伦·梅纳德

13
“明确定义”(明确明确的行为定义)与“任意定义”(基于判断力做出的选择)不同。例如,一个人可能很容易说过:“没有哪个比什么都重要”。这同样定义明确,但仍然很随意。
约翰·费米内拉

1
实际上,允许在无可比拟的类型之间进行比较非常方便(例如,输入完整性检查),对我而言,使此类比较始终返回False似乎是合乎逻辑的-就像在将数值与NaN进行比较时一样。不幸的是,情况并非如此(例如None<0return True),并且显然在Python 3中,通过完全禁止这种比较来处理-确实是一个巨大的“改进”!;-)
Rolf Bartstra 2012年

2
没有一个比所有事物都具有更大的感觉比它拥有的事物比所有事物具有更大的感觉要少得多。空字符串在任何其他字符串之前,“零”在任何正整数之前,因此直观地讲,None类型在任何其他类型之前。
HorseloverFat

29

从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;
    ...
}

编辑:添加了版本号。


1
我假设这是针对Python 2.x的?
MatrixFrog 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.