查看: 1675|回复: 2

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

[复制链接]

9

主题

74

帖子

185

积分

注册会员

Rank: 2

积分
185
发表于 2018-9-18 17:12:48 | 显示全部楼层 |阅读模式
以下代码段使用输出进行注释(如ideone.com上所示):
  1. print "100" < "2"      # True
  2. print "5" > "9"        # False

  3. print "100" < 2        # False
  4. print 100 < "2"        # True

  5. print 5 > "9"          # False
  6. print "5" > 9          # True

  7. print [] > float('inf') # True
  8. print () > []          # True
复制代码

有人可以解释为什么输出是这样的?
回复

使用道具 举报

11

主题

80

帖子

199

积分

注册会员

Rank: 2

积分
199
发表于 2018-9-18 17:14:45 | 显示全部楼层
本帖最后由 强人锁男 于 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()
回复

使用道具 举报

10

主题

72

帖子

180

积分

注册会员

Rank: 2

积分
180
发表于 2018-9-18 17:15:25 | 显示全部楼层
字符串按字典顺序进行比较,不同类型通过其类型名称("int"< "string")进行比较。3.x通过使它们不具有可比性来修复第二点。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表