本帖最后由 强人锁男 于 2018-9-18 17:15 编辑
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() |