¿Cómo compara Python 2 string e int? ¿Por qué las listas se comparan como números mayores y las tuplas mayores que las listas?

El siguiente fragmento de código se anota con la salida ( como se ve en ideone.com ):

print "100"  "9" # False print "100" < 2 # False print 100  "9" # False print "5" > 9 # True print [] > float('inf') # True print () > [] # True 

¿Alguien puede explicar por qué la salida es como tal?


Detalles de implementacion

  • ¿Es este comportamiento exigido por la especificación de idioma, o depende de los implementadores?
  • ¿Hay diferencias entre cualquiera de las implementaciones principales de Python?
  • ¿Hay diferencias entre las versiones del lenguaje Python?

Del manual de python 2 :

Detalle de implementación de CPython: los objetos de diferentes tipos, excepto los números, están ordenados por sus nombres de tipo; los objetos del mismo tipo que no admiten una comparación adecuada están ordenados por su dirección.

Cuando ordena dos cadenas o dos tipos numéricos, la ordenación se realiza de la manera esperada (orden lexicográfico para la cadena, orden numérico para los enteros).

Cuando ordena un tipo numérico y un tipo no numérico, el tipo numérico aparece primero.

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

Cuando ordena dos tipos incompatibles donde ninguno de los dos es numérico, se ordenan por orden alfabético de sus nombres de tipo:

 >>> [1, 2] > 'foo' # 'list' < 'str' False >>> (1, 2) > 'foo' # 'tuple' > 'str' True >>> class Foo(object): pass >>> class Bar(object): pass >>> Bar() < Foo() True 

Una excepción son las clases de estilo antiguo que siempre vienen antes que las clases de estilo nuevo.

 >>> class Foo: pass # old-style >>> class Bar(object): pass # new-style >>> Bar() < Foo() False 

¿Es este comportamiento exigido por la especificación de idioma, o depende de los implementadores?

No hay especificación de lenguaje . La referencia del lenguaje dice:

De lo contrario, los objetos de diferentes tipos siempre se comparan de forma desigual, y se ordenan de manera consistente pero arbitraria.

Así que es un detalle de implementación.

¿Hay diferencias entre cualquiera de las implementaciones principales de Python?

No puedo responder a esta pregunta porque solo he usado la implementación oficial de CPython, pero hay otras implementaciones de Python como PyPy.

¿Hay diferencias entre las versiones del lenguaje Python?

En Python 3.x, el comportamiento se ha cambiado de modo que al intentar ordenar un número entero y una cadena generará un error:

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

Las cadenas se comparan de forma lexicográfica y los tipos diferentes se comparan por el nombre de su tipo ( "int" < “string” ). 3.x arregla el segundo punto haciéndolos no comparables.