Сравнение Нет со встроенными типами с использованием арифметических операторов?
Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> None > 0
False
>>> None == 0
False
>>> None < 0
True
- Сравнение
None
с использованием арифметических операторов, хорошо определенных для встроенных типов (целые числа в этом случае)?
- Разница между первой и третьей сравнительной частью спецификации языка (спецификация Python - вы должны шутить:)) или это детализация CPython?
Ответы
Ответ 1
Единственное содержательное сравнение, которое вы действительно можете использовать с None
, - это if obj is None:
(или if obj is not None:
).
Сравнение между различными типами было удалено с Python 3 по уважительным причинам - они были общим источником ошибок и приводили к путанице. Например
>>> "3" < 4
False
В Python 3 вы получаете TypeError
при сравнении значений разных типов, таких как str
vs. int
или что-либо против None
.
>>> None < 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: NoneType() < int()
(я имею в виду "сравнение" в смысле попытки определить, какое из двух значений больше/меньше. Сравнение для равенства в порядке - оно всегда будет возвращать False
, если два объекта имеют разные типы.)
Я не нашел ссылку в документах для этого, но в Learning Python, 4-е издание Марк Лутц пишет на стр. 204:
[...] Сравнение объектов с различной типизацией (например, строки и список) - язык определяет фиксированный порядок между различными типы, которые детерминированы, если не эстетически. То есть, порядок основан на именах задействованных типов: все целые числа меньше всех строк, например, потому что "int"
меньше, чем "str"
.
Ответ 2
Некоторые интересные цитаты из http://bytes.com/topic/python/answers/801701-why-none-0-a
В раннем Python было принято решение о сравнении любого два объекта были законными и возвратили бы последовательный результат. Итак, объекты разных типов будут сопоставляться в соответствии с заказом на их типы (зависимые от реализации, неопределенные, но непротиворечивые упорядочение), а объекты того же типа будут сравниваться в соответствии с правила, которые имеют смысл для этого типа.
Другие реализации имеют право сравнивать целое число и None иначе, но при конкретной реализации результат не будет изменение.
Python 3 создаст исключение для таких сравнений.
и
Проблема типична; У Python изначально не было Boolean type, а модификация привела к странной семантике. C имеет тот же вопрос.