¿Cómo compara Python 2 string e int? ¿Por qué las listas se comparan como mayores que los números y las tuplas mayores que las listas?
El siguiente fragmento está anotado con el resultado ( como se ve en 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
¿Alguien puede explicar por qué el resultado es como tal?
Detalles de implementacion
- ¿Este comportamiento lo exige la especificación del lenguaje o depende de los implementadores?
- ¿Existen diferencias entre cualquiera de las principales implementaciones de Python?
- ¿Existen diferencias entre las versiones del lenguaje Python?
Del manual de Python 2 :
Detalle de la implementación de CPython: los objetos de diferentes tipos, excepto los números, se ordenan por sus nombres de tipo; Los objetos del mismo tipo que no admiten una comparación adecuada se ordenan por su dirección.
Cuando ordena dos cadenas o dos tipos numéricos, el orden se realiza de la forma esperada (orden lexicográfico para cadenas, orden numérico para números enteros).
Cuando solicita un tipo numérico y no numérico, el tipo numérico viene primero.
>>> 5 < 'foo'
True
>>> 5 < (1, 2)
True
>>> 5 < {}
True
>>> 5 < [1, 2]
True
Cuando pides dos tipos incompatibles donde ninguno es numérico, se ordenan por el 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
¿Este comportamiento lo exige la especificación del lenguaje o depende de los implementadores?
No hay especificación de idioma . La referencia del idioma dice:
De lo contrario, los objetos de diferentes tipos siempre se comparan de manera desigual y se ordenan de manera consistente pero arbitraria.
Entonces es un detalle de implementación.
¿Existen diferencias entre cualquiera de las principales implementaciones de Python?
No puedo responder a esta porque solo he usado la implementación oficial de CPython, pero existen otras implementaciones de Python como PyPy.
¿Existen diferencias entre las versiones del lenguaje Python?
En Python 3.x, el comportamiento se ha cambiado de modo que intentar ordenar un número entero y una cadena generará un error:
>>> '10' > 5
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
'10' > 5
TypeError: unorderable types: str() > int()
Las cadenas se comparan lexicográficamente y los tipos diferentes se comparan por el nombre de su tipo ( "int"
< "string"
). 3.x soluciona el segundo punto haciéndolos no comparables.