为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

湖上湖 2019-05-27 16:55:36
Python 2如何比较字符串和int?为什么列表比较大于数字,而元组大于列表?以下代码段使用输出进行注释(如ideone.com上所示):print "100" < "2"      # Trueprint "5" > "9"        # Falseprint "100" < 2        # Falseprint 100 < "2"        # Trueprint 5 > "9"          # Falseprint "5" > 9          # Trueprint [] > float('inf') # Trueprint () > []          # True有人可以解释为什么输出是这样的?实施细节这种行为是由语言规范强制执行的,还是由实现者决定的?任何主要的Python实现之间是否存在差异?Python语言版本之间是否存在差异?
查看完整描述

2 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

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()


查看完整回答
反对 回复 2019-05-27
  • 2 回答
  • 0 关注
  • 1976 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信