Python 2 如何比较不同类型的对象?
- 2024-11-21 08:33:00
- admin 原创
- 6
问题描述:
以下代码片段带有输出注释(如在 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 语言的不同版本之间有区别吗?
解决方案 1:
来自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()
解决方案 2:
字符串按字典顺序进行比较,不同类型则按其类型的名称 ( "int"
< "string"
) 进行比较。3.x 通过使它们不可比较来修复第二点。
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD