【问题标题】:Comparing None with built-in types using arithmetic operators?使用算术运算符将 None 与内置类型进行比较?
【发布时间】:2012-02-16 04:12:13
【问题描述】:
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 的实现细节?

【问题讨论】:

  • ==!= 通常是安全的,但你应该使用 is Noneis not None 来处理单例,例如 None 按照 PEP-8
  • @ThiefMaster 问题的重点是这里的 safe 是什么意思。我很清楚应该使用isNone 进行比较,但问题是具体的,并没有询问应该使用哪个运算符。

标签: python comparison cpython


【解决方案1】:

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。)

我在文档中没有找到相关参考,但在 Learning Python, 4th edition,Mark Lutz 在第 204 页上写道:

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

【讨论】:

  • None &lt; 0 为真的技术原因是什么?
  • @wim: None 是 Python 2 中的“最低类型”,所以 None 总是低于任何 int 总是低于任何 str 等等。
  • @PiotrDobrogost:不知道,但我添加了 Mark Lutz 的《学习 Python》一书中的一句话(强烈推荐)。
  • (...) 语言定义了不同类型之间的固定排序 (...) 也就是说,排序基于所涉及类型的名称 在与不同类型的 (...) 对象的矛盾将根据其类型的顺序进行比较(依赖于实现,(...) 在wim的答案中引用。真相在哪里?
  • @batbrat:对不起,我的意思是平等。感谢您发现此错误。固定。
【解决方案2】:

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

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

其他实现有权比较整数和无 不同,但在特定的实现上,结果不会 改变。

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

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

【讨论】:

  • 这真的很恶心。尽可能长时间避免使用 Python 3 的另一个原因。因此,您现在无法对异构对象列表进行排序...&gt;&gt;&gt; sorted([2, 1.5, 2.5]) [1.5, 2, 2.5] &gt;&gt;&gt; sorted([2, 1.5, 2.5, 'bla', '2', '2.5', None]) Traceback (most recent call last): File "&lt;stdin&gt;", line 1, in &lt;module&gt; TypeError: unorderable types: str() &lt; int()
  • 我认为这是 prefer python 3 的一个原因。sorted([2, 1.5, 2.5, 'bla', '2', '2.5', None]) 的预期结果是什么?
  • @TomaszGandor 在 2021 年阅读您的评论?
  • @moveaway00 - [None, 1.5, 2, 2.5, '2', '2.5', 'bla'],如果不检查,我至少会说 None 应该排在第一位(数字在字符串之前?这也很有意义)。 @jtlz2 - 是的,从那以后发生了很大变化。一个这样的事情是好的旧 Python 3.6。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
相关资源
最近更新 更多