Этот вопрос уже имеет ответ здесь:
Есть ли Python встроенный тип данных, кроме того None
, для которого:
>>> not foo > None
True
где foo
значение того типа? Как насчет Python 3?
Нет
всегда меньше любого типа данных на Python 2 (см. object.c
).
На Python 3 это было изменено; теперь сравнение вещей без разумного естественного упорядочения приводит к ошибке типа TypeError
. С 3.0 "что нового":
Python 3. 0 упростил правила сравнения заказов:
Операторы сравнения заказов (
<
,<=
,>=
,>
) вызывают исключениеОшибка типа
, когда операнды не имеют осмысленного естественного порядка следования. Таким образом, выражения типа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: Добавлен номер версии.