【问题标题】:Why is '' > 0 True in Python 2?为什么在 Python 2 中 '' > 0 True?
【发布时间】:2011-01-23 22:53:26
【问题描述】:

在 Python 2.x 中:

>>> '' > 0
True

这是为什么呢?

【问题讨论】:

标签: python logic operators python-2.x


【解决方案1】:

允许对任意对象进行顺序比较的最初设计动机是允许对异构列表进行排序——这很有用,这将使所有字符串按字母顺序彼此相邻,所有数字按数字顺序彼此相邻,尽管语言不能保证这两个块中的哪一个先出现。例如,这允许在O(N log N) 最坏情况下仅获取任何列表中的唯一项目(即使是具有不可散列项目的项目)

多年来,这种务实的安排逐渐被侵蚀。当对复数进行排序比较的能力被取消时,第一次破解就出现了,在相当多的版本之前。突然,对任何列表进行排序的能力消失了:如果列表包含复数,可能还有其他类型的项目,它就不再适用了。然后 Guido 开始更普遍地不喜欢异构列表,因此开始认为这些列表是否可以有用地排序并不真正重要......因为这样的列表首先不应该存在,按照他的新思路。他没有做任何事情来禁止他们,但也不愿意接受任何妥协来支持他们。

请注意,这两项更改都使平衡稍微偏离了 Python 之禅的“实用性胜过纯度”项目(早先编写的,当时复数仍然可以进行顺序比较;-) – 纯度更高,实用性更低。

尽管如此,排序比较两个任意对象(只要两者都不是复数 ;-) 的能力仍然存在很长时间,因为大约在同一时间 Guido 开始真正坚持保持强大的向后兼容性(这是 既实用纯;-)。

因此,只有在 Python 3 中,它明确且有意地移除了强向后兼容性的约束,以允许一些长期渴望但向后不兼容的增强功能(尤其是简化和移除过时的、冗余的方式来执行某些任务),该顺序比较不同类型的实例会出错。

所以这篇历史和哲学论文基本上是真正回答你的“为什么”问题的唯一方法......! :-)

【讨论】:

  • 也许应该补充一点,虽然该语言可能不再具有此功能,但使用自定义比较器可以轻松地对任意列表进行排序。自己编写以备不时之需——这也是一种非常实用的方法。
  • 注意:在 Python 2 中,复数可以与任何其他对象进行比较,除了另一个复数! complex(1,0) > 'abc'Falsecomplex(1,0) > complex(0,0) 引发 TypeError
  • @EricDuminil 不完全正确 - 复杂不能与布尔、整数或分数进行比较。出于某种原因(可能是疏忽),它们可以与小数进行比较。
  • @wim:感谢您的有趣评论。您在技术上是正确的:最好的正确!这几乎是有道理的,因为我们可以将布尔、整数、分数和浮点数视为复数。但是小数也应该在那里。无论如何,它是针对 python2 的,所以它随着时间的推移变得不那么重要了。
【解决方案2】:

来自https://docs.python.org/2.7/tutorial/datastructures.html#id1

请注意,比较不同类型的对象是合法的。结果 是确定性但任意的:类型按其名称排序。 因此,列表总是小于字符串,字符串总是 小于元组等 [1] 比较混合数字类型 根据它们的数值,所以 0 等于 0.0,等等。

【讨论】:

  • 很奇怪。令人耳目一新的是他们不再允许在 Python 3.0 中这样做
  • 这不是全部;例如,5 < ArithmeticError(),即使 'int' > 'ArithmeticError'ArithmeticError 不是数字类型。
  • 要了解整个故事,请查看here
猜你喜欢
  • 2013-09-02
  • 1970-01-01
  • 2011-10-31
  • 2016-05-02
  • 2021-09-02
  • 2011-12-19
  • 1970-01-01
  • 2017-12-17
  • 2014-09-25
相关资源
最近更新 更多