Python 2 如何比较字符串和整数?为啥列表比较大于数字,而元组大于列表?

Posted

技术标签:

【中文标题】Python 2 如何比较字符串和整数?为啥列表比较大于数字,而元组大于列表?【英文标题】:How does Python 2 compare string and int? Why do lists compare as greater than numbers, and tuples greater than lists?Python 2 如何比较字符串和整数?为什么列表比较大于数字,而元组大于列表? 【发布时间】:2011-03-17 06:54:36 【问题描述】:

以下 sn-p 用输出注释 (as seen on ideone.com):

print "100" < "2"      # True
print "5" > "9"        # False

print "100" < 2        # False
print 100 < "2"        # True

print 5 > "9"          # False
print "5" > 9          # True

print [] > float('inf') # True
print () > []          # True

有人可以解释为什么输出是这样的吗?


实现细节

这种行为是语言规范规定的,还是由实现者决定的? 主要的 Python 实现之间是否存在差异? Python 语言版本之间是否存在差异?

【问题讨论】:

在这个问题的 3000 次重复中,this one 有一个答案,解释了为什么语言是这样设计的(以及为什么在 3.x 中重新设计了它) .这不是本问题的一部分,而是此处链接的许多问题的一部分。 【参考方案1】:

来自python 2 manual:

CPython 实现细节:除数字外的不同类型的对象按其类型名称排序;不支持正确比较的相同类型的对象按其地址排序。

当您对两个字符串或两个数字类型进行排序时,排序以预期的方式完成(字符串的字典顺序,整数的数字排序)。

当您订购数字和非数字类型时,数字类型排在第一位。

>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < 
True
>>> 5 < [1, 2]
True

当您订购两个都不是数字的不兼容类型时,它们按其类型名称的字母顺序排序:

>>> [1, 2] > 'foo'   # 'list' < 'str' 
False
>>> (1, 2) > 'foo'   # 'tuple' > 'str'
True

>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True

一个例外是旧式类总是在新式类之前。

>>> class Foo: pass           # old-style
>>> class Bar(object): pass   # new-style
>>> Bar() < Foo()
False

这种行为是语言规范规定的,还是由实现者决定的?

有no language specification。 language reference 说:

否则,不同类型的对象总是比较不相等,并且顺序一致但随意。

所以这是一个实现细节。

任何主要的 Python 实现之间是否存在差异?

这个我无法回答,因为我只用过官方的CPython实现,但是还有其他Python的实现比如PyPy。

Python 语言版本之间有区别吗?

在 Python 3.x 中,行为已更改,因此尝试对整数和字符串进行排序会引发错误:

>>> '10' > 5
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    '10' > 5
TypeError: unorderable types: str() > int()

【讨论】:

这很好,他们在 Py3k 中改变了它。当我第一次看到这个问题时,我的想法是'什么,这不会引发错误?'。 注: 2.x 规则的一个例外是,不同类型按类型名称排序,即 None 对象总是比其他所有类型都少。在 3.x 中,将 None 与其他类型进行比较仍会引发 TypeError。 @KarelBilek: bool 是一种数字类型。 True==1 所以它既不是 。 它们的类型名称的字典顺序?你什么时候会希望它成为一个功能?谁会使用它? 有趣的事实:complex(1,0) &gt; 'abc'Falsecomplex(1,0) &gt; complex(0,0) 引发了 TypeError【参考方案2】:

字符串按字典顺序进行比较,不同类型按其类型名称进行比较 ("int" "string")。 3.x 通过使它们不可比来修复第二点。

【讨论】:

但在 python2 中,int 比 dicts 少,所以不能只按类型名称按字典顺序排列? 我刚刚看到这个答案并同意托尼·萨福克的观点。对象不同时不按类型名称排序。 @TonySuffolk66 数字类型是该规则的例外。在 2.7 中,NumericType 始终低于任何其他类型(NoneType 除外)。

以上是关于Python 2 如何比较字符串和整数?为啥列表比较大于数字,而元组大于列表?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Python 2 允许列表和数字之间的比较? [复制]

为啥python处理排序列表比未排序列表花费更多时间

Python:如何使用 for 循环合并两个列表,如 zip

在 python 中,为啥从数组读取比从列表读取慢?

为啥整数上的 in_array 严格模式比非严格模式慢?

为啥在 Python 2.7 中手动字符串反转比切片反转更糟糕? Slice 中使用的算法是啥?