以下代码段使用输出 (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 2 manual :
CPython implementation detail: Objects of different types except numbers are ordered by their type names; objects of the same types that don’t support proper comparison are ordered by their address.
当您对两个字符串或两个数字类型进行排序时,排序是以预期的方式完成的(字符串的字典顺序,整数的数字排序)。
当您订购数字和非数字类型时,数字类型排在第一位。
>>> 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
一个异常(exception)是旧式类总是在新式类之前。
>>> class Foo: pass # old-style
>>> class Bar(object): pass # new-style
>>> Bar() < Foo()
False
Is this behavior mandated by the language spec, or is it up to implementors?
有no language specification . language reference说:
Otherwise, objects of different types always compare unequal, and are ordered consistently but arbitrarily.
所以这是一个实现细节。
Are there differences between any of the major Python implementations?
这个我无法回答,因为我只用过官方的CPython实现,但是还有其他Python的实现比如PyPy。
Are there differences between versions of the Python language?
在 Python 3.x 中,行为已更改,因此尝试对整数和字符串进行排序会引发错误:
>>> '10' > 5
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
'10' > 5
TypeError: unorderable types: str() > int()
https://stackoverflow.com/questions/3270680/