一切都比无?

Att*_* O. 65 python python-datamodel python-3.x

是否有Python内置数据类型,除此之外None:

>>> not foo > None
True
Run Code Online (Sandbox Code Playgroud)

foo这个类型的值在哪里?Python 3怎么样?

Joh*_*lla 80

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

在Python 3中,这已经改变了; 现在在没有合理的自然排序的情况下对事物进行比较会导致a TypeError.从3.0"什么是新的"更新:

Python 3.0简化了订购比较的规则:

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

这会使一些人感到不安,因为它通常很方便地执行诸如对列表中包含某些None值的列表进行排序,并使None值在开头或结尾处聚集在一起.不久之前,邮件列表上有一个关于这个问题的帖子,但最终的一点是Python 3试图避免对排序做出任意决定(这在Python 2中发生了很多).

  • "明确定义"(明确,明确的行为定义)与"任意"(基于自由裁量权的选择)截然不同.例如,人们可以很容易地说"没有比一切更好".这同样定义明确,但仍然相当武断. (13认同)
  • 当然,只要明确定义,就没有任何关于订购None的任意内容.这种无偿的不兼容性是Python 3采用这么长时间的原因. (2认同)
  • 没有比较小于一切感觉比让它比较大于一切感觉更随意。空字符串在任何其他字符串之前,'零'在任何正整数之前,所以直观地,None 类型在任何其他类型之前。 (2认同)

Tor*_*rek 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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

编辑:添加版本号.

  • 我假设这是针对 Python 2.x 的? (2认同)