Python如何比较string和int?

以下代码片段用输出注释( 如在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手册 :

CPython实现细节:除数字以外的其他types的对象按其types名称sorting; 相同types的不支持正确比较的对象按地址sorting。

当您订购两个string或两个数字types时,按照预期的方式进行sorting(string的字典sorting,整数的数字sorting)。

当您订购一个数字和一个非数字types时,数字types首先。

 >>> 5 < 'foo' True >>> 5 < (1, 2) True >>> 5 < {} True >>> 5 < [1, 2] True 

当您订购两个不兼容的types时,它们都是按照其types名称的字母顺序sorting的:

 >>> [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 

这种行为是由语言规范强制的,还是由实现者决定?

没有语言规范 。 语言参考说:

否则,不同types的对象总是比较不平等,而且是一贯而不是任意的。

所以这是一个实现细节。

任何主要的Python实现之间是否有区别?

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

Python语言的版本有差异吗?

在Python 3.x中,行为已经被改变了,所以试图命令一个整数和一个string会引发一个错误:

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

string按字典顺序进行比较,不同的types通过types的名称( "int" < "string" )进行比较。 3.x通过使它们不可比较来修正第二点。