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?

提问人:polygenelubricants 提问时间:7/17/2010 最后编辑:ivan_pozdeevpolygenelubricants 更新时间:3/2/2019 访问量:87008

问:

以下代码片段与输出一起注释(如 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 语言的版本之间有区别吗?
Python 类型 比较 python-2.x

评论

26赞 abarnert 10/24/2013
在这个问题的 3000 个重复中,这个问题有一个答案,解释了为什么该语言是这样设计的(以及为什么它在 3.x 中被重新设计)。这不是这个问题的一部分,而是这里链接的许多问题的一部分。
0赞 Karl Knechtel 6/29/2022
另请参阅(非重复):stackoverflow.com/questions/2214194

答:

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'Falsecomplex(1,0) > complex(0,0)TypeError