Почему приведен следующий код:
>>> foo = {}
>>> foo > 1
True
>>> foo < 1
False
>>> foo == 0
False
>>> foo == -1
False
>>> foo == 1
False
Я понимаю, что я хотел был len (foo) > 1, но, как новичок, это меня удивило.
Почему приведен следующий код:
>>> foo = {}
>>> foo > 1
True
>>> foo < 1
False
>>> foo == 0
False
>>> foo == -1
False
>>> foo == 1
False
Я понимаю, что я хотел был len (foo) > 1, но, как новичок, это меня удивило.
Из docs:
Операторы <, > , ==, > =, < =, и!= сравнивают значения двух объектов. Объекты не должны иметь один и тот же тип. Если оба являются числами, они преобразуются в общий тип. В противном случае объекты разных типов всегда сравниваются неравномерно и упорядочиваются последовательно, но произвольно. Вы можете контролировать поведение сравнения объектов нестроенных типов, определяя метод
__cmp__
или богатые методы сравнения, такие как__gt__
, описанные в разделе 3.4.(Это необычное определение сравнения было использовано для упрощения определения операций, таких как сортировка, а не в операторах. В будущем правила сравнения для объектов разных типов могут измениться.)
богатое сравнение между несовместимыми типами основано на имени (?) типа в python2.x и не разрешено в python3.x.
В любом случае в python2.x гарантируется, что упорядочение даст те же результаты для конкретной реализации и версии python, но само упорядочение не определено.
Я думаю, что это могло возникнуть из-за того, что операторы сравнения должны быть частично определены, чтобы быть выведенными, т.е. если вы можете проверить для == и < то вы можете получить остальные операторы, <= is (< or ==), > не является <= и т.д., поэтому в случае foo = {} вы можете получить:
Python 2:
>>> foo == 0
False
>>> foo < 0
False
>>> not (foo <= 0)
True
so:
>>> foo > 0
True
python 3:
>>> foo = {}
>>> foo < 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: dict() < int()
>>> foo > 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: dict() > int()
>>> foo == 0
False
>>>