Ale*_*lli 82

允许对任意对象进行顺序比较的原始设计动机是允许对异构列表进行排序 - 有用的是,将所有字符串按字母顺序排列在彼此旁边,并且所有数字按数字顺序彼此相邻,尽管首先出现的两个街区并没有得到语言的保证.例如,在O(N log N)最坏的情况下,这允许在任何列表(即使是具有不可清洗项目的列表)中仅获取唯一项目

多年来,这种务实的安排受到侵蚀.第一次破解是在很多版本之前取消了比较复杂数字的能力时出现的.突然间,对任何列表进行排序的能力消失了:如果列表包含复数,则可能不再适用,可能还包含其他类型的项目.然后圭多开始更普遍不喜欢异构名单,从而开始思考,它并没有真正重要,如果这样的列表,可以有效地分拣或不...因为这样的名单应首先不存在的,根据他的新思维.他没有做任何事情来禁止他们,但也不倾向于接受任何妥协来支持他们.

请注意,这两项更改都使得余额稍微偏离了Python的Zen的"实用性节拍纯度"项目(之前已经写过,当复杂的数字仍然可以进行订购时比较;-) - 更纯粹一点,实用性稍差.

然而,订购的能力 - 比较两个任意对象(只要两者都不是一个复杂的数字;-)保持了很长一段时间,因为大约在同一时间Guido开始真正坚持保持强大的向后兼容性(这种转变实用纯粹;-).

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

因此,这篇历史和哲学论文基本上是真正回应你的"为什么"问题的唯一方法......!:-)

  • @EricDuminil 不完全正确 - 复杂不能与布尔、整数或分数进行比较。由于某种原因(可能是疏忽)它们可以与小数进行比较。 (2认同)

Dyn*_* Fu 21

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

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

  • 奇怪的.令人耳目一新的是,他们不再允许在Python 3.0中使用它 (6认同)
  • 这不是故事的全部;例如,即使 `'int' > 'ArithmeticError'` 和 `ArithmeticError` 不是数字类型,`5 < ArithmeticError()`。 (2认同)