为什么在Python 2中'' > 0为真?
在Python 2.x中:
>>> '' > 0
True
这是为什么呢?
2 个回答
来自 https://docs.python.org/2.7/tutorial/datastructures.html#id1
要注意,不同类型的对象进行比较是合法的。比较的结果是确定的,但也有点随意:这些类型是按照它们的名字排序的。因此,列表总是比字符串小,字符串总是比元组小,等等。[1] 不同数字类型的比较是根据它们的数值来进行的,所以0等于0.0,等等。
最初设计允许比较不同对象的顺序,是为了能够对各种类型的列表进行排序。这样做的好处是,可以把所有字符串按字母顺序排在一起,把所有数字按大小顺序排在一起,虽然语言并不保证这两类之间的顺序。举个例子,这样可以在任何列表中(即使是包含不能哈希的项目的列表)以 O(N log N)
的最坏情况时间获取唯一的项目。
随着时间的推移,这种实用的安排逐渐被削弱。第一次变化发生在不再支持比较复数的能力,这个变化是在几年前的某个版本中。突然之间,排序任何列表的能力消失了:如果列表中包含复数,可能还有其他类型的项目,那么就不再适用排序了。接着,Guido(Python 的创始人)开始对混合类型的列表产生不喜欢的情绪,认为这些列表根本不应该存在,因此他觉得它们是否能有效排序也不重要。他没有禁止这些列表的存在,但也不愿意为了支持它们而妥协。
需要注意的是,这些变化让“实用性胜过纯粹性”的原则在 Python 的哲学中稍微偏离了一点(这个原则是在复数仍然可以被比较时写的 ;-) — 变得更纯粹了一点,实用性少了一点。
尽管如此,比较两个任意对象的能力(只要它们不是复数 ;-) 在很长一段时间内仍然存在,因为在那个时候,Guido 开始非常坚持保持强大的向后兼容性(这是一种既实用又纯粹的转变;-)。
所以,直到 Python 3,明确并故意去掉了强向后兼容性的限制,允许一些长期渴望但与向后兼容性不符的改进(特别是简化和去除过时、冗余的做法),不同类型实例的顺序比较才变成了错误。
所以,这段历史和哲学的讨论基本上是对你“为什么”问题的唯一真实回应...! :-)