提问人:polygenelubricants 提问时间:7/17/2010 最后编辑:ivan_pozdeevpolygenelubricants 更新时间:3/2/2019 访问量:87008
Python 2 如何比较 string 和 int?为什么列表比数字大,元组比列表大?
How does Python 2 compare string and int? Why do lists compare as greater than numbers, and tuples greater than lists?
问:
以下代码片段与输出一起注释(如 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 语言的版本之间有区别吗?
答:
24赞
Ignacio Vazquez-Abrams
7/17/2010
#1
字符串按字典进行比较,不同类型按其类型名称 ( < ) 进行比较。3.x 通过使它们不具有可比性来修复第二点。"int"
"string"
评论
3赞
Tony Suffolk 66
4/30/2017
但是在 python2 中,int 小于 dicts,所以它不能只按类型名称进行词典编排?
1赞
Exelian
6/8/2017
我刚刚遇到了这个答案,并同意托尼·萨福克(Tony Suffolk)的观点。当对象不相似时,对象不按类型名称排序。
0赞
lef
10/15/2017
@TonySuffolk66数值类型是该规则的例外。在 2.7 中,NumericType 始终低于任何其他类型(NoneType 除外)。
210赞
Mark Byers
7/17/2010
#2
来自 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()
评论
59赞
JAL
7/17/2010
他们在 Py3k 中更改了它,这很好。当我第一次看到这个问题时,我的想法是“什么,这不会引发错误?
9赞
Dave Kirby
7/17/2010
注意2.x 规则的一个例外是,不同类型按类型名称排序,即 None 对象的比较始终小于其他所有类型。在 3.x 中,将 None 与另一种类型进行比较仍会引发 TypeError。
5赞
abarnert
10/12/2013
@KarelBilek:bool 是一种数值类型。和 True==1,所以它既不是<也不是>。
4赞
Jacklynn
11/15/2014
其类型名称的词典顺序?你什么时候希望这成为一项功能?谁会用它?
4赞
Eric Duminil
1/23/2017
有趣的事实:是但提出了一个complex(1,0) > 'abc'
False
complex(1,0) > complex(0,0)
TypeError
评论