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

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

以下代码段使用输出进行注释(如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实现之间是否存在差异?

  • Python语言版本之间是否存在差异?


湖上湖
浏览 1977回答 2
2回答

holdtom

从python 2手册:CPython实现细节:除了数字之外的不同类型的对象按其类型名称排序;&nbsp;不支持正确比较的相同类型的对象按其地址排序。当您订购两个字符串或两个数字类型时,排序以预期的方式完成(字符串的字典顺序,整数的数字排序)。当您订购数字和非数字类型时,数字类型首先出现。>>> 5 < 'foo'True>>> 5 < (1, 2)True>>> 5 < {}True>>> 5 < [1, 2]True当您订购两个不兼容的类型(两者都不是数字)时,它们按其类型名的字母顺序排序:>>> [1, 2] > 'foo'&nbsp; &nbsp;# 'list' < 'str'&nbsp;False>>> (1, 2) > 'foo'&nbsp; &nbsp;# 'tuple' > 'str'True>>> class Foo(object): pass>>> class Bar(object): pass>>> Bar() < Foo()True一个例外是旧式类,它总是出现在新式类之前。>>> class Foo: pass&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# old-style>>> class Bar(object): pass&nbsp; &nbsp;# new-style>>> Bar() < Foo()False这种行为是由语言规范强制执行的,还是由实现者决定的?有没有语言规范。该语言参考说:否则,不同类型的对象总是比较不相等,并且一致但是任意地排序。所以它是一个实现细节。任何主要的Python实现之间是否存在差异?我无法回答这个,因为我只使用了官方的CPython实现,但还有其他Python实现,如PyPy。Python语言版本之间是否存在差异?在Python 3.x中,行为已更改,因此尝试排序整数和字符串将引发错误:>>> '10' > 5Traceback (most recent call last):&nbsp; File "<pyshell#0>", line 1, in <module>&nbsp; &nbsp; '10' > 5TypeError: unorderable types: str() > int()
打开App,查看更多内容
随时随地看视频慕课网APP