Существует ли встроенный тип данных Python, кроме None
, для которого:
>>> not foo > None
True
где foo
- значение этого типа? Как насчет Python 3?
Существует ли встроенный тип данных 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).
Из источника 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. Добавлен номер версии.