是否有一个 Python 内置的数据类型 除了 None:
None
>>> not foo > None True
其中 foo是该类型的值? Python3如何?
foo
None总是小于 Python 2中的任何数据类型(参见 object.c)。
object.c
在 Python3中,这种情况发生了改变; 现在对事物进行比较时,如果没有合理的自然顺序,结果就是 TypeError。来自 一个 href = “ https://docs.python.org/3/whatsnew/3.0.html # ordering-properties”rel = “ noReferrer”> 3.0“ what’s new”update :
TypeError
Python 3.0简化了排序比较的规则: 排序比较操作符(<、 <=、 >=、 >)在操作数没有有意义的自然排序时引发 TypeError异常。因此,诸如: 1 < ''、 0 > None或 len <= len之类的表达式不再有效,例如,None < None引发 TypeError而不是返回 <=0。一个推论是,对异构列表进行排序不再有意义——所有元素必须彼此可比。请注意,这并不适用于 <=1和 <=2操作符: 不同类型的不可比对象总是相互比较不相等。
Python 3.0简化了排序比较的规则:
排序比较操作符(<、 <=、 >=、 >)在操作数没有有意义的自然排序时引发 TypeError异常。因此,诸如: 1 < ''、 0 > None或 len <= len之类的表达式不再有效,例如,None < None引发 TypeError而不是返回 <=0。一个推论是,对异构列表进行排序不再有意义——所有元素必须彼此可比。请注意,这并不适用于 <=1和 <=2操作符: 不同类型的不可比对象总是相互比较不相等。
<
<=
>=
>
1 < ''
0 > None
len <= len
None < None
这让一些人感到不安,因为对一个包含一些 None值的列表进行排序,并在开始或结束时将 None值聚集在一起,这样做通常很方便。邮件列表上有一个关于这个问题的帖子有一段时间了,但最重要的一点是 Python 3试图避免对排序做出武断的决定(这在 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; ... }
编辑 : 添加版本号。