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

Pio*_*ost 27 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
Run Code Online (Sandbox Code Playgroud)
  • None使用为内置类型定义的算术运算符(在本例中为整数)进行比较?
  • 是语言规范的前两个和第三个比较部分之间的区别(Python的规范 - 你一定是开玩笑:) :)或者它是CPython的实现细节?

Tim*_*ker 26

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

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

>>> "3" < 4
False
Run Code Online (Sandbox Code Playgroud)

在Python 3,你会得到一个TypeError比较不同类型,如值时,strint或任何对None.

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

(我的意思是"比较",试图确定两个值中哪一个更大/更小.相等的比较是正确的 - False如果两个对象属于不同类型,它将始终返回.)

我没有在文档中找到这方面的参考,但是在学习Python第4版中,Mark Lutz在第204页写道:

[...]比较不同类型的对象(例如,字符串和列表)工作 - 该语言定义了不同类型之间的固定顺序,如果不是美学上令人满意的话,这是确定性的.也就是说,排序基于所涉及类型的名称:所有整数都小于所有字符串,例如,因为"int"小于 "str".

  • @wim:`None`是Python 2中的"最低类型",所以`None`总是低于任何`int`,它总是低于任何`str`等. (4认同)
  • "无<0"为真的技术原因是什么? (2认同)

wim*_*wim 6

一些有趣的引用来自http://bytes.com/topic/python/answers/801701-why-none-0-a

在早期的Python中,决定任何 两个对象的比较是合法的并且将返回一致的结果.因此,不同类型的对象将根据其类型的排序(依赖于实现,未指定但是一致的排序)进行比较,并且将根据对该类型有意义的规则来比较相同类型的对象.

其他实现有权以不同方式比较整数和None,但在特定实现中,结果不会更改.

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

问题是典型的问题; Python最初没有布尔类型,并且改造导致了奇怪的语义.C有同样的问题.

  • 我认为这是_prefer_ python 3的一个原因..来自`sorted([2,1.5,2.5,'bla','2','2.5',无])`的预期结果是什么? (11认同)