以下代码段带有输出注释(如 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手册:
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()