Python 2如何比较string和int?为什么列表比数字大,元组比列表大?

发布于 2021-02-02 23:24:19

以下代码段带有输出注释(如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语言的版本之间有区别吗?
关注者
0
被浏览
167
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    从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()
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看