一切都大于无?
是否有一个Python内置的数据types, 除了None
,其中:
>>> not foo > None True
foo
是哪种types的值? 那么Python 3呢?
None
总是小于Python 2中的任何数据types(请参阅object.c
)。
在Python 3中,这已经改变了; 现在比较事物没有一个明智的自然sorting导致TypeError
。 从3.0版“新function”更新 :
Python 3.0简化了sorting比较的规则:
当操作数没有有意义的自然sorting时,sorting比较运算符(
<
,<=
,>=
,>
)会引发TypeError
exception。 因此,如下所示的expression式:1 < ''
,0 > None
或len <= len
不再有效,例如None < None
引发TypeError
而不返回False
。 一个推论就是sorting一个异构列表不再有意义 – 所有的元素必须是可比较的。 请注意,这不适用于==
和!=
运算符:不同types的对象总是比较不相等。
这让一些人感到不安,因为做这样的事情往往很方便,比如sorting一些有None
值的列表,并在开始或结束时将None
值聚集在一起。 关于这个问题,邮件列表上有一个线索 ,但最终的观点是,Python 3试图避免对sorting(这是Python 2中发生的事情)做出任意决定。
从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; ... }
编辑 :添加版本号。