2010-02-06 10 views
58

Esiste un Python incorporato tipo di dati, oltre None, per il quale:È tutto superiore a None?

>>> not foo > None 
True 

dove foo è un valore di quel tipo? Che ne dici di Python 3?

risposta

71

None è sempre inferiore a qualsiasi tipo di dati in Python 2 (vedere object.c).

In Python 3, questo è stato modificato; ora facendo confronti su cose senza un ragionevole ordinamento naturale risulta in un TypeError. Dal 3.0 "what's new" updates:

Python 3.0 ha semplificato le regole per i confronti che ordinano:

Gli operatori di confronto ordinamento (<, <=, >=, >) sollevare un'eccezione TypeError quando gli operandi non hanno un ordinamento naturale significativo. Pertanto, espressioni come: 1 < '', 0 > None o len <= len non sono più valide e ad es. None < None alza TypeError invece di restituire False. Un corollario è che la classificazione di una lista eterogenea non ha più senso - tutti gli elementi devono essere comparabili tra loro. Si noti che questo non si applica agli operatori == e !=: gli oggetti di tipi diversi e incomparabili si confrontano sempre in modo non uguale tra loro.

Questo sconvolto alcune persone da quando è stato spesso utile per fare le cose come sorta una lista che aveva alcune None valori in essa, e hanno i valori None appaiono raggruppati insieme all'inizio o alla fine. There was a thread on the mailing list about this un po 'indietro, ma il punto finale è che Python 3 cerca di evitare di prendere decisioni arbitrarie sull'ordinazione (che è ciò che è accaduto molto in Python 2).

+1

Grazie per aver chiarito lo stato di Python 3. Ricordo di aver letto la pagina "cosa c'è di nuovo" ma non ricordo questo. Molto interessante, ma ha davvero senso ... –

+2

Ovviamente, non c'è nulla di arbitrario nell'ordinare Nessuno, a patto che sia chiaramente definito. Questo tipo di incompatibilità gratuita è il motivo per cui l'adozione di Python 3 richiede così tanto tempo. –

+12

"Ben definito" (chiara, esplicita definizione di comportamento) è distinto da "arbitrario" (una scelta fatta sulla base della discrezione). Ad esempio, si potrebbe facilmente dire "Nessuno è più grande di tutto". Questo è altrettanto ben definito, ma ancora abbastanza arbitrario. –

27

Dalla sorgente 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; 
    ... 
} 

EDIT: Aggiunto il numero di versione.

+1

Questo è per Python 2.x presumo? – MatrixFrog

+0

il collegamento è 2.6 –

+0

Grazie, questa è una risposta molto chiara! –