Вопрос

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

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

>>> not foo > None
True

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

Это было полезно?

Решение

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

Редактировать:Добавлен номер версии.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top