在 Python 中,None 的计算结果小于零? [复制]

Posted

技术标签:

【中文标题】在 Python 中,None 的计算结果小于零? [复制]【英文标题】:In Python, None evaluates to less than zero? [duplicate] 【发布时间】:2011-11-15 01:48:16 【问题描述】:

在 Python 中,None 的计算结果小于零?

ActivePython 2.7.2.5 (ActiveState Software Inc.) based on
Python 2.7.2 (default, Jun 24 2011, 12:21:10) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> None < 0
True
>>> None == 0
False
>>> None > 0
False
>>>

这是预期的吗?

我猜想None 要么等于零(通过类型强制),要么所有这些语句都返回False

【问题讨论】:

无论如何,在 Python 3 中你不能再这样做了。它会给你这个错误:TypeError: unorderable types: NoneType() &lt; int() @NullUserException:很高兴知道。因为这不是我期望从 Python 中获得的那种直观行为。 别忘了,即使它是动态类型的,Python 仍然是类型的:即不执行隐式强制。 @Daniel 如果您将boolint 进行比较(或者至少看起来如此),它们就是这样 为了扩展@NullUserException,布尔实际上被明确声明为整数常量01的非常薄的包装器,带有特殊的__str____repr__。数学、逻辑和其他一切在两者上的工作方式完全相同,bool 甚至是int 的子类。这与1 + 1.0 一样是隐式转换,导致浮点数。 【参考方案1】:

来自the docs:

CPython 实现细节: 除数字外的不同类型的对象按其类型名称排序;不支持正确比较的相同类型的对象按其地址排序。

NoneType 比较小于int,因为比较似乎区分大小写。

>>> type(0)
<type 'int'>
>>> type(None)
<type 'NoneType'>
>>> 'NoneType' < 'int'
True

【讨论】:

这不可能,因为print(5 &gt; ) 给了你错误,而int &gt; dict @NullUserException:有趣。除非我遗漏了什么,否则这似乎与文档相矛盾。 @NullUserException: type(5) &gt; type() 给出错误,所以这部分是一致的,尽管我不确定他们为什么像你所说的那样比较 int &gt; dict。但是,type(None) &gt; type(0)。嗯…… @NullUserException @hammar - 我在这里得到int &lt; dict,在 Python 2.6.6 上。但也不一致type(None) &gt; type(0)None &lt; 0... @NullUserException:文档说“不同类型的对象除了数字”(强调我的)。【参考方案2】:

见the manual:

不同类型的对象,除了不同的数值类型和不同的字符串类型,从不比较相等;此类对象的排序一致但任意(因此对异构数组进行排序会产生一致的结果)。

CPython 实现细节: 除数字外的不同类型的对象按其类型名称排序;不支持正确比较的相同类型的对象按其地址排序。

【讨论】:

我喜欢它所说的“一致但任意地订购”的部分。多么有用... 是的。您通常希望排序操作在每次使用时都能产生相同的结果。 含糊但足够了:)【参考方案3】:

有意对排序和字典比较等操作进行明确定义。

[引用自Language Reference]

运算符 、==、>=、

【讨论】:

以上是关于在 Python 中,None 的计算结果小于零? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

python中小于负无穷大的数字? [复制]

复利计算器4.1

从零开始学习PYTHON3讲义画一颗心送给你

python从零开始第3篇--从数字0开始说起

Python 从零基础开始概述

如何在多个表的 COUNT 聚合中计算零结果?