比较Python中的字符串和数字

时间:2012-01-04 18:49:47

标签: python string comparison numbers

  

可能重复:
  How does Python compare string and int?

为什么下面的部分表现得像它的表现?

>>> '10' > 100
True
>>> 100 < '10'
True

不应该引发异常吗?

5 个答案:

答案 0 :(得分:6)

来自documentation

  

CPython实现细节:除了数字之外的不同类型的对象按其类型名称排序;不支持正确比较的相同类型的对象按其地址排序。

所以它只是在CPython('int' < 'str')中发生的事情,但不能保证在其他实现中发生。

实际上,python3中已删除此行为:

>>> '10' > 100
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: str() > int()
>>> 100 < '10'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < str()

答案 1 :(得分:1)

来自manual

CPython implementation detail: Objects of different types except numbers are 
ordered  by their type names; objects of the same types that don’t 
support proper comparison are ordered by their address.

因此,如果你比较这两种类型:int / string你有一个词典顺序bye元素的类型

答案 2 :(得分:0)

调用不同的运算符,在某一点调用__gt__,在另一个运算符调用__lt__

检查一下:

class t(int):
  def __gt__(self, other):
    print 'here', v
    return v

class t2(str):
  def __lt__(self, other):
    v = super(t2, self).__lt__(other)
    print 'ohere', v
    return v

if __name__ == '__main__':
  a = t('10')
  b = t2(100)

  a > b
  b < a

答案 3 :(得分:-1)

因为Python为数字实现了隐式类型转换,所以它们可以打印成字符串而不进行显式转换。

在与字符串1000进行比较时,Python正在将"1000"转换为字符串"10"。根据Python解释器,"1000"确实大于“10”。

这就是为什么:"I've got %s bananas" % 5000有效的原因,与C或其他没有隐式类型转换的语言不同,我没有必要printf("I've got %i bananas", 5000);

查看Python docs chapter 5: Built-in Types

答案 4 :(得分:-1)

我不是百分百肯定,但这里可能会发生一些内部类型转换。它可能正在进行所谓的词典比较,其中ASCII中的'1'大于1(第一个数字),依此类推。