【发布时间】:2011-01-23 22:53:26
【问题描述】:
在 Python 2.x 中:
>>> '' > 0
True
这是为什么呢?
【问题讨论】:
-
顺便说一句,Python 3.0 为相同的比较生成
TypeError: unorderable types: str() > int()
标签: python logic operators python-2.x
在 Python 2.x 中:
>>> '' > 0
True
这是为什么呢?
【问题讨论】:
TypeError: unorderable types: str() > int()
标签: python logic operators python-2.x
允许对任意对象进行顺序比较的最初设计动机是允许对异构列表进行排序——这很有用,这将使所有字符串按字母顺序彼此相邻,所有数字按数字顺序彼此相邻,尽管语言不能保证这两个块中的哪一个先出现。例如,这允许在O(N log N) 最坏情况下仅获取任何列表中的唯一项目(即使是具有不可散列项目的项目)
多年来,这种务实的安排逐渐被侵蚀。当对复数进行排序比较的能力被取消时,第一次破解就出现了,在相当多的版本之前。突然,对任何列表进行排序的能力消失了:如果列表包含复数,可能还有其他类型的项目,它就不再适用了。然后 Guido 开始更普遍地不喜欢异构列表,因此开始认为这些列表是否可以有用地排序并不真正重要......因为这样的列表首先不应该存在,按照他的新思路。他没有做任何事情来禁止他们,但也不愿意接受任何妥协来支持他们。
请注意,这两项更改都使平衡稍微偏离了 Python 之禅的“实用性胜过纯度”项目(早先编写的,当时复数仍然可以进行顺序比较;-) – 纯度更高,实用性更低。
尽管如此,排序比较两个任意对象(只要两者都不是复数 ;-) 的能力仍然存在很长时间,因为大约在同一时间 Guido 开始真正坚持保持强大的向后兼容性(这是 既实用和纯;-)。
因此,只有在 Python 3 中,它明确且有意地移除了强向后兼容性的约束,以允许一些长期渴望但向后不兼容的增强功能(尤其是简化和移除过时的、冗余的方式来执行某些任务),该顺序比较不同类型的实例会出错。
所以这篇历史和哲学论文基本上是真正回答你的“为什么”问题的唯一方法......! :-)
【讨论】:
complex(1,0) > 'abc' 是 False 但 complex(1,0) > complex(0,0) 引发 TypeError
来自https://docs.python.org/2.7/tutorial/datastructures.html#id1
请注意,比较不同类型的对象是合法的。结果 是确定性但任意的:类型按其名称排序。 因此,列表总是小于字符串,字符串总是 小于元组等 [1] 比较混合数字类型 根据它们的数值,所以 0 等于 0.0,等等。
【讨论】:
5 < ArithmeticError(),即使 'int' > 'ArithmeticError' 和 ArithmeticError 不是数字类型。