【问题标题】:In Python, None evaluates to less than zero? [duplicate]在 Python 中,None 的计算结果小于零? [复制]
【发布时间】: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 一样是隐式转换,导致浮点数。

标签: python python-2.x


【解决方案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]

运算符 、==、>=、

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-09
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    相关资源
    最近更新 更多