examples equal comparador python types comparison python-2.x

equal - string python 3



¿Cómo compara Python string e int? (2)

El siguiente fragmento está anotado 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

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

Detalles de implementacion

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

Desde el manual de python 2 :

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

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

Cuando solicita un tipo numérico y no numérico, el tipo numérico es lo primero.

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

Cuando solicita 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 de 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 del idioma o depende de los implementadores?

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

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

Entonces es un detalle de implementación.

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

No puedo responder a esto 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 ha sido modificado, por lo que intentar ordenar un 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 corrige el segundo punto al hacer que no sean comparables.