Все больше никто? [дубликат]


этот вопрос уже есть ответ здесь:

  • Несколько меньше, чем минус бесконечность в Python? 1 ответ

есть ли встроенный тип данных Python,кроме того None для которых:

>>> not foo > None
True

здесь foo является ли значение этого типа? Как насчет Python 3?

2 59

2 ответа:

None всегда меньше, чем любой тип данных в Python 2 (см. object.c).

в Python 3 это было изменено; теперь выполнение сравнений по вещам без разумного естественного упорядочения приводит к TypeError. Из 3.0 "что нового" обновления:

Python 3.0 упростил правила для упорядочивания сравнений:

операторы сравнения заказов (<,<=,>=, >) поднять TypeError исключение, когда операнды не имеют значимого естественного порядка. Таким образом, выражения типа: 1 < '',0 > None или len <= len больше не действительны, и, например,None < None поднимает TypeError вместо возврата False. Следствием этого является то, что сортировка гетерогенного списка больше не имеет смысла – все элементы должны быть сопоставимы друг с другом. Обратите внимание, что это не относится к == и != операторы: объекты различных несравнимых типов всегда сравниваются неравные друг другу.

это расстроило некоторых людей, так как часто было удобно делать такие вещи, как сортировать список, который имел некоторые None значения в нем, и есть None значения сгруппированы вместе в начале или в конце. в списке рассылки была тема об этом некоторое время назад, но конечная точка заключается в том, что Python 3 пытается избежать принятия произвольных решений о заказе (что и произошло в Python 2).

из питона 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 добавлен номер версии.