【问题标题】:Why a string in always "greater than" a number? [duplicate]为什么一个字符串总是“大于”一个数字? [复制]
【发布时间】:2013-11-02 09:27:28
【问题描述】:

我刚刚注意到 Python 允许您将字符串值与数字进行比较:

>>> '10' > 1000
True
>>> 'a' > 1000
True
>>> 'a' > -1000
True

为什么任何字符串总是大于任何数字?

【问题讨论】:

  • 你在比较两种不同的类型,没有任何有意义的比较,所以我相信这取决于解释器的实现。
  • 如果你问的是“为什么 Python 选择这个规则”而不是“什么是规则”,Alex Martelli's answer 在另一个问题上可能是你要找的。
  • @abarnert 很好地解释了为什么会这样,以及为什么这会在 Python 3 中引发错误,谢谢。

标签: python


【解决方案1】:

在 Python 2 中,§5.3 - Comparisons 说:

不同类型的对象,除了不同的数值类型和不同的字符串类型,从不比较相等; 此类对象的排序一致但任意(因此对异构数组进行排序会产生一致的结果)。此外,某些类型(例如,文件对象)仅支持退化的比较概念,其中该类型的任何两个对象都不相等。同样,这些对象的顺序是任意但一致的。当任何操作数为复数时,<<=>>= 运算符将引发 TypeError 异常。

在 Python 3 中,§4.3 - Comparisons 说:

不同类型的对象,除了不同的数字类型,永远不会比较相等。此外,某些类型(例如,函数对象)仅支持退化的比较概念,其中该类型的任何两个对象都不相等。 <<=>>= 运算符将在将复数与另一个内置数字类型进行比较时引发 TypeError 异常对象属于无法比较的不同类型,或者在其他没有定义顺序的情况下。

【讨论】:

  • 在其下方添加“CPython 实现细节”可能也是值得的,这解释了为什么他看到特定的“一致但任意”的顺序。 (虽然它不是 100% 完成的;它并没有解释 None 总是小于其他任何东西,数字类型总是小于任何非None,或者“数字”的含义,或者规则用于处理内置数字类型的病态子类,或者……但唯一可以在源代码中找到更多解释的地方。)
猜你喜欢
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
相关资源
最近更新 更多