Python 2如何比较string和int?为什么列表比较的结果大于数字,而元组的结果大于列表?


178

以下代码段带有输出注释(如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语言的版本之间有区别吗?

23
这个问题的3000点了DUP,这其中有一个答案解释为什么语言被设计成这样(以及为什么它是在3.X重新设计)。这不是这个问题的一部分,而是在这里链接的许多问题的一部分。
abarnert

Answers:


209

python 2手册

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

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

没有语言规范。该语言参考说:

否则,不同类型的对象总是比较不相等,并且被一致地,任意地排序。

因此,这是一个实现细节。

任何主要的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()

55
很好,他们在Py3k中进行了更改。当我第一次看到这个问题时,我的想法是“什么,这不会引发错误?”。
日,日本

9
注意:2.x规则的例外是按类型名称排序不同类型,这是None对象总是比所有其他类型都少。在3.x中,将None与其他类型进行比较仍会引发TypeError。
戴夫·柯比

4
@KarelBilek:bool是数字类型。而且True == 1,所以它既不是<也不是>。
abarnert

3
其类型名称按字典顺序排列?您什么时候希望将其作为功能?谁会使用它?
杰克

3
有趣的事实:complex(1,0) > 'abc'Falsecomplex(1,0) > complex(0,0)引发了一场TypeError
Eric Duminil

24

字符串字典顺序比较,不同类型由它们的类型的名称进行比较("int"< "string")。3.x通过使它们不可比来解决了第二点。


3
但是在python2中,int小于dict,因此不能仅仅按名称在字典上进行排序吗?
托尼·萨福克

我只是碰到了这个答案,并同意托尼·萨福克的观点。不同时,对象不按类型名称排序。
Exelian

@ TonySuffolk66数字类型是该规则的例外。NumericType始终低于2.7中的任何其他类型(NoneType除外)。
lef
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.