Подтвердить что ты не робот

Почему пустой словарь больше 1?

Почему приведен следующий код:

>>> foo = {}
>>> foo > 1
True
>>> foo < 1
False
>>> foo == 0
False
>>> foo == -1
False
>>> foo == 1
False

Я понимаю, что я хотел был len (foo) > 1, но, как новичок, это меня удивило.

4b9b3361

Ответ 1

Из docs:

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

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

Ответ 2

богатое сравнение между несовместимыми типами основано на имени (?) типа в python2.x и не разрешено в python3.x.

В любом случае в python2.x гарантируется, что упорядочение даст те же результаты для конкретной реализации и версии python, но само упорядочение не определено.

Ответ 3

Я думаю, что это могло возникнуть из-за того, что операторы сравнения должны быть частично определены, чтобы быть выведенными, т.е. если вы можете проверить для == и < то вы можете получить остальные операторы, <= 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
>>>