Python如何比较字符串和int?

问题:

以下代码段使用输出(as seen on 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

有人可以解释为什么输出是这样吗?

实施细节

  • 这种行为是由语言规范规定的,还是由执行者?
  • 任何主要的Python实现之间有区别吗?
  • Python语言的版本是否有区别?

回答:

python 2 manual

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

这种行为是由语言规范规定的,还是由执行者?

no language specificationlanguage reference说:

否则,不同类型的对象总是比较不平等,并且被一致但任意地排序。

所以这是一个实现细节。

任何主要的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()

Code问答: http://codewenda.com/topics/python/
Stackoverflow: How does Python compare string and int?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

4 + 5 =