В Python None оценивается меньше нуля?

В Python None меньше нуля?

ActivePython 2.7.2.5 (ActiveState Software Inc.) based on
Python 2.7.2 (default, Jun 24 2011, 12:21:10) [MSC v.1500 32 bit (Intel)] on win
32
Type "help", "copyright", "credits" or "license" for more information.
>>> None < 0
True
>>> None == 0
False
>>> None > 0
False
>>>

Ожидается ли это?

Я бы предположил, что None будет либо равно нулю (через приведение типов), либо все эти операторы вернут False.


person Mike M. Lin    schedule 12.09.2011    source источник
comment
Как бы то ни было, вы больше не можете делать это в Python 3. Это даст вам эту ошибку: TypeError: unorderable types: NoneType() < int()   -  person NullUserException    schedule 12.09.2011
comment
@NullUserException: это полезно знать. Потому что это не то интуитивное поведение, которое я ожидаю от Python.   -  person Joachim Sauer    schedule 12.09.2011
comment
Не забывайте, что несмотря на динамическую типизацию, Python по-прежнему является строгой типизацией: то есть неявное приведение типов не выполняется.   -  person Daniel Roseman    schedule 12.09.2011
comment
@Daniel Да, если сравнить bool с int (или, по крайней мере, так кажется)   -  person NullUserException    schedule 12.09.2011
comment
Чтобы расширить @NullUserException, логические значения на самом деле явно указаны как очень тонкие оболочки вокруг целочисленных констант 0 и 1 со специальными __str__ и __repr__. Математика, логика и все остальное работают одинаково на обоих, bool даже является подклассом int. Это такое же неявное преобразование, как 1 + 1.0, приводящее к поплавку.   -  person    schedule 12.09.2011


Ответы (3)


См. руководство:

Объекты разных типов, за исключением разных числовых типов и разных строковых типов, никогда не сравниваются равными; такие объекты упорядочены последовательно, но произвольно (чтобы сортировка разнородного массива давала согласованный результат).

а также

Детали реализации CPython. Объекты разных типов, кроме чисел, упорядочены по именам типов; объекты одного типа, которые не поддерживают правильное сравнение, упорядочиваются по их адресу.

person ThiefMaster    schedule 12.09.2011
comment
Мне нравится та часть, где говорится, что заказано последовательно, но произвольно. Как полезно... - person Mike M. Lin; 12.09.2011
comment
Да это так. обычно вы хотите, чтобы операции сортировки давали одни и те же результаты каждый раз, когда вы их используете. - person ThiefMaster; 12.09.2011
comment
расплывчато, но достаточно :) - person Vitaliy Terziev; 20.09.2017

Из документов:

Детали реализации CPython. Объекты разных типов, кроме чисел, упорядочены по именам типов; объекты одного типа, которые не поддерживают правильное сравнение, упорядочиваются по их адресу.

NoneType сравнивается как меньшее, чем int, так как сравнение кажется чувствительным к регистру.

>>> type(0)
<type 'int'>
>>> type(None)
<type 'NoneType'>
>>> 'NoneType' < 'int'
True
person hammar    schedule 12.09.2011
comment
Этого не может быть, так как print(5 > {}) дает вам false, а int > dict - person NullUserException; 12.09.2011
comment
@NullUserException: Интересно. Казалось бы, это противоречит документации, если только я что-то не упустил. - person hammar; 12.09.2011
comment
@NullUserException: type(5) > type({}) дает false, так что эта часть непротиворечива, хотя я не уверен, почему они сравниваются таким образом, когда, как вы сказали, int > dict. Однако type(None) > type(0). Хм.... - person hammar; 12.09.2011
comment
@NullUserException @hammar — я получаю int < dict здесь, на Python 2.6.6. Но также непоследовательное type(None) > type(0), но None < 0... - person detly; 12.09.2011
comment
@NullUserException: в документе говорится, что объекты разных типов кроме чисел (выделено мной). - person Marco Leogrande; 29.07.2014
comment
вы просто сравниваете две строки ››› 'N' ‹ 'i' True - person JoulinRouge; 17.04.2020

Мы намеренно четко определили такие операции, как сортировка и сравнение по словарю.

[цитата из справочника по языку]

Операторы ‹, >, ==, >=, ‹= и != сравнивают значения двух объектов. Объекты не обязательно должны иметь один и тот же тип. Если оба являются числами, они преобразуются в общий тип. В противном случае объекты разных типов всегда сравниваются неодинаково и упорядочены последовательно, но произвольно.

person grep    schedule 12.09.2011