42

在 Python 2.x 中:

>>> '' > 0
True

这是为什么?

4

2 回答 2

91

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

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

请注意,这两项更改都使平衡偏离了 Python Zen 的“实用性胜过纯度”项目(这是较早编写的,当复数仍然可以进行顺序比较时;-) – 更纯粹一点,a实用性差一点。

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

因此,只有在 Python 3 中,它明确且有意地删除了强向后兼容性的约束,以允许一些长期需要但向后不兼容的增强功能(特别是简化和删除过时的、执行某些任务的冗余方式),实例的顺序比较不同类型的成为错误。

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

于 2010-03-05T02:16:19.987 回答
23

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

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

于 2010-03-05T02:00:40.617 回答