用算术运算符比较None和内置类型?

29 投票
2 回答
28839 浏览
提问于 2025-04-17 10:50
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 个回答

6

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

在早期的Python中,决定允许比较任何两个对象,并且这个比较会返回一致的结果。所以,不同类型的对象会根据它们的类型顺序进行比较(这个顺序是依赖于具体实现的,虽然没有明确说明,但会保持一致),而同一类型的对象则会根据该类型的合理规则进行比较。

其他实现可以选择以不同的方式比较整数和None,但在特定的实现中,结果不会改变。

在Python 3中,进行这样的比较会引发异常。

还有

这个问题是典型的;Python最初没有布尔类型,后来添加这个功能导致了一些奇怪的语义。C语言也有同样的问题。

32

你可以用 None 进行的唯一有意义的比较就是 if obj is None:(或者 if obj is not None:)。

在 Python 3 中,不同类型之间的比较被取消了,这是有原因的——因为这常常会导致错误和混淆。比如说:

>>> "3" < 4
False

在 Python 3 中,当你比较不同类型的值,比如 strint,或者任何东西和 None 时,你会遇到 TypeError 错误。

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

我说的“比较”是指试图判断两个值哪个更大或更小。判断两个值是否相等是可以的——如果两个对象类型不同,它总是会返回 False

我在文档中没有找到相关的参考,但在 《学习Python》第四版 中,Mark Lutz 在第204页写道:

[...] 不同类型对象(例如,一个字符串和一个列表)之间的比较是可以的——语言定义了不同类型之间的固定顺序,这个顺序是确定的,虽然不一定好看。也就是说,这个顺序是基于类型名称的:所有整数都小于所有字符串,因为 "int" 小于 "str"

撰写回答