¿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?

Resuelto polygenelubricants asked hace 14 años • 2 respuestas

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?
polygenelubricants avatar Jul 17 '10 14:07 polygenelubricants
Aceptado

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()
Mark Byers avatar Jul 17 '2010 07:07 Mark Byers

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.

Ignacio Vazquez-Abrams avatar Jul 17 '2010 07:07 Ignacio Vazquez-Abrams