Domanda

    

Questa domanda ha già una risposta qui:

         

Esiste un tipo di dato Python built-in, oltre None , per il quale:

>>> not foo > None
True

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

È stato utile?

Soluzione

None è sempre inferiore rispetto a qualsiasi tipo di dato in Python 2 (vedi object.c ).

In Python 3, questo è stato cambiato; ora sta facendo i confronti sulle cose senza un sensibile risultati ordinamento naturale in un TypeError. Dal 3.0 "Novità" aggiornamenti :

  

Python 3.0 ha semplificato le regole per ordinare i confronti:

     

Gli operatori di confronto ordinazione (<, <=, >=, >) sollevare un'eccezione TypeError quando gli operandi non hanno un ordinamento naturale significativo. Così, espressioni come: 1 < '', 0 > None o len <= len non sono più validi, e per esempio None < None solleva TypeError invece di ritornare False. Un corollario è che l'ordinamento di un elenco eterogeneo non ha più senso - tutti gli elementi devono essere confrontabili tra loro. Si noti che questo non si applica agli operatori == e !=:. Oggetti di tipo diverso incomparabili confrontano sempre disuguale gli uni agli altri

Questa sconvolto alcune persone da quando è stato spesso utile per fare le cose come sorta una lista che aveva alcuni valori None in esso, e hanno i valori None appaiono raggruppati insieme all'inizio o alla fine. C'era un filo sulla mailing list su questo un po 'indietro, ma il punto finale è che Python 3 cerca di evitare di prendere decisioni arbitrarie di ordinare (che è quello che è successo molto in Python 2).

Altri suggerimenti

Dal Python 2.7.5 sorgente ( 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;
    ...
}

Modifica :. Inserito il numero di versione

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top