使用算术运算符将None与内置类型进行比较?

时间:2012-01-22 12:22:44

标签: python comparison cpython

Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> None > 0
False
>>> None == 0
False
>>> None < 0
True
  • 使用为内置类型定义的算术运算符(本例中是整数)来比较None吗?
  • 语言规范的前两个和第三个比较部分之间的区别(Python的规范 - 你一定是在开玩笑:) :)或者它是CPython的实现细节吗?

2 个答案:

答案 0 :(得分:23)

您可以与None真正使用的唯一有意义的比较是if obj is None:(或if obj is not None:)。

不同类型之间的比较已从Python 3中删除,原因很充分 - 它们是错误的常见来源并导致混淆。例如

>>> "3" < 4
False

在Python 3中,在比较不同类型的值时会得到TypeError,例如strint或任何与None的对比。

>>> None < 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: NoneType() < int()

(我的意思是“比较”,试图确定两个值中哪一个更大/更小。相等的比较是正常的 - 如果两个对象的类型不同,它将始终返回False。)< / p>

我没有在文档中找到这方面的参考,但在Learning Python, 4th edition中,Mark Lutz在第204页写道:

  

[...]比较不同类型的对象(例如,字符串和a   list)work - 该语言定义了不同的固定顺序   类型,这是确定性的,如果不是美学上令人愉悦的话。那是,   排序基于所涉及类型的名称:所有整数   例如,因为"int"小于所有字符串,所以少于所有字符串   "str"

答案 1 :(得分:6)

来自http://bytes.com/topic/python/answers/801701-why-none-0-a

的一些有趣的引用
  

在早期的Python中,决定对任何进行比较   两个对象是合法的,并将返回一致的结果。所以对象   不同类型的将根据他们的订单进行比较   类型(依赖于实现,未指定但是一致)   订购),将根据相似类型的对象进行比较   对这种类型有意义的规则。

     

其他实现有权比较整数和None   不同,但在具体实施方面,结果不会   变化

     

Python 3将在此类比较中引发异常。

  

问题是典型的问题; Python原本没有   布尔类型,并且改造导致奇怪的语义。 C有   同样的问题。

相关问题