2 回答
TA贡献1805条经验 获得超10个赞
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()
添加回答
举报