El siguiente fragmento se anota con la salida ( 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é la salida es como tal?
Detalles de implementacion
- ¿Es este comportamiento obligatorio por las especificaciones del lenguaje, o depende de los implementadores?
- ¿Hay diferencias entre alguna de las principales implementaciones de Python?
- ¿Hay diferencias entre las versiones del lenguaje Python?
python
types
comparison
python-2.x
poligenelubricantes
fuente
fuente
Respuestas:
Del manual de Python 2 :
Cuando ordena dos cadenas o dos tipos numéricos, la ordenación se realiza de la manera esperada (ordenación lexicográfica para cadena, ordenación numérica para enteros).
Cuando solicita un tipo numérico y otro no numérico, el tipo numérico es lo primero.
Cuando ordena dos tipos incompatibles donde ninguno es numérico, se ordenan por orden alfabético de sus nombres de tipo:
Una excepción son las clases de estilo antiguo que siempre vienen antes que las clases de estilo nuevo.
No hay especificación de idioma . La referencia del lenguaje dice:
Por lo tanto, es un detalle de implementación.
No puedo responder a esto porque solo he usado la implementación oficial de CPython, pero hay otras implementaciones de Python como PyPy.
En Python 3.x, el comportamiento ha cambiado para que intentar ordenar un número entero y una cadena genere un error:
fuente
complex(1,0) > 'abc'
esFalse
perocomplex(1,0) > complex(0,0)
plantea unTypeError
Las cadenas se comparan lexicográficamente, y los tipos diferentes se comparan por el nombre de su tipo (
"int"
<"string"
). 3.x corrige el segundo punto haciéndolos no comparables.fuente