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

pol*_*nts 172 python comparison types python-2.x

以下代码段使用输出进行注释(如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
Run Code Online (Sandbox Code Playgroud)

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


实施细节

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

Mar*_*ers 204

python 2手册:

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

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

当您订购数字和非数字类型时,数字类型首先出现.

>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True
Run Code Online (Sandbox Code Playgroud)

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

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

>>> class Foo(object): pass
>>> class Bar(object): pass
>>> Bar() < Foo()
True
Run Code Online (Sandbox Code Playgroud)

一个例外是旧式类,它总是出现在新式类之前.

>>> class Foo: pass           # old-style
>>> class Bar(object): pass   # new-style
>>> Bar() < Foo()
False
Run Code Online (Sandbox Code Playgroud)

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

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

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

所以它是一个实现细节.

任何主要的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()
Run Code Online (Sandbox Code Playgroud)

  • 他们在Py3k中改变它很好.当我第一次看到这个问题时,我的想法是'什么,这不会引起错误?'. (55认同)
  • NB 2.x规则的一个例外,即按类型名称排序不同类型的是None对象始终比其他每种类型都要小.在3.x中将None与另一种类型进行比较仍然会引发TypeError. (8认同)
  • @KarelBilek:bool是一种数字类型.而真== 1所以它既不是<nor>. (4认同)
  • 有趣的事实:`complex(1,0)>'abc'`是'False`但是`complex(1,0)> complex(0,0)`引发了一个`TypeError` (3认同)
  • 他们的类型名称的Lexography顺序?你什么时候想要这个功能?谁会用到那个? (2认同)

Ign*_*ams 23

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

  • 但是在python2中int小于dicts所以它不能只是按类型名称按字典顺序排列? (2认同)