代码之家  ›  专栏  ›  技术社区  ›  polygenelubricants

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

  •  168
  • polygenelubricants  · 技术社区  · 14 年前

    下面的代码段是用输出注释的( 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
    
    print [] > float('inf') # True
    print () > []          # True
    

    有人能解释为什么输出是这样的吗?


    实施细则

    • 这种行为是由语言规范规定的,还是由实现者决定的?
    • 在任何主要的Python实现之间都有区别吗?
    • Python语言的不同版本之间有区别吗?
    2 回复  |  直到 6 年前
        1
  •  210
  •   xnx    5 年前

    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 specification . 这个 language reference 说:

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

    所以这是一个实现细节。

    我不能回答这个问题,因为我只使用了官方的CPython实现,但是还有pypypy等Python的其他实现。

    >>> '10' > 5
    Traceback (most recent call last):
      File "<pyshell#0>", line 1, in <module>
        '10' > 5
    TypeError: unorderable types: str() > int()
    
        2
  •  24
  •   jamylak    12 年前

    从词典学的角度进行比较,不同的类型按其类型的名称进行比较( "int" < "string" ). 3.x修正了第二点,使它们不具有可比性。