2010-02-06 14 views

Respuesta

71

None es siempre menor que cualquier tipo de datos en Python 2 (consulte object.c).

En Python 3, esto se cambió; ahora haciendo comparaciones en cosas sin un orden natural sensato resulta en un TypeError. Desde el 3.0 "what's new" updates:

Python 3.0 ha simplificado las normas para las comparaciones Orden:

Los operadores de comparación de pedidos (<, <=, >=, >) provocará una excepción TypeError cuando los operandos no tienen un orden natural significativo. Por lo tanto, expresiones como: 1 < '', 0 > None o len <= len ya no son válidas, y p. None < None aumenta TypeError en lugar de devolver False. Un corolario es que ordenar una lista heterogénea ya no tiene sentido, todos los elementos deben ser comparables entre sí. Tenga en cuenta que esto no se aplica a los operadores == y !=: los objetos de diferentes tipos incomparables siempre se comparan desigualmente entre sí.

Esto molestó a algunas personas, ya que a menudo era útil para hacer cosas como ordenar una lista que tenía algunas None valores en ella, y tienen los valores None aparecen agrupados juntos al principio o al final. There was a thread on the mailing list about this hace un tiempo, pero el punto final es que Python 3 intenta evitar tomar decisiones arbitrarias sobre los pedidos (que es lo que sucedió mucho en Python 2).

+1

Gracias por aclarar el estado de Python 3. Recuerdo haber leído la página "lo nuevo" pero no recuerdo esta. Muy interesante, pero tiene sentido, de hecho ... –

+2

Por supuesto, no hay nada arbitrario en ordenar Ninguno, siempre y cuando esté claramente definido. Este tipo de incompatibilidad gratuita es la razón por la que la adopción de Python 3 lleva tanto tiempo. –

+12

"Bien definido" (definición clara y explícita de comportamiento) es distinto de "arbitrario" (una elección hecha en base a la discreción). Por ejemplo, uno podría haber dicho tan fácilmente "Ninguno se compara más que todo". Eso está igualmente bien definido, pero aún bastante arbitrario. –

27

Desde la fuente de Python 2.7.5 (object.c):

static int 
default_3way_compare(PyObject *v, PyObject *w) 
{ 
    ... 
    /* None is smaller than anything */ 
    if (v == Py_None) 
      return -1; 
    if (w == Py_None) 
      return 1; 
    ... 
} 

EDITAR: Añadido número de versión.

+1

Esto es para Python 2.x supongo? – MatrixFrog

+0

el enlace es 2.6 –

+0

Gracias, esta es una respuesta muy clara! –

Cuestiones relacionadas