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?
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?
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'eccezioneTypeError
quando gli operandi non hanno un ordinamento naturale significativo. Pertanto, espressioni come:1 < ''
,0 > None
olen <= len
non sono più valide e ad es.None < None
alzaTypeError
invece di restituireFalse
. 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).
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.
Questo è per Python 2.x presumo? – MatrixFrog
il collegamento è 2.6 –
Grazie, questa è una risposta molto chiara! –
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 ... –
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. –
"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. –