Вопрос-Ответ

Why does the expression 0 < 0 == 0 return False in Python?

Почему выражение 0 < 0 == 0 возвращает False в Python?

Заглядывая в Queue.py в Python 2.6, я обнаружил эту конструкцию, которая показалась мне немного странной:

def full(self):
"""Return True if the queue is full, False otherwise
(not reliable!)."""

self.mutex.acquire()
n = 0 < self.maxsize == self._qsize()
self.mutex.release()
return n

Если maxsize равно 0, очередь никогда не заполняется.

Мой вопрос в том, как это работает в данном случае? Каким образом 0 < 0 == 0 считается False?

>>> 0 < 0 == 0
False
>>> (0) < (0 == 0)
True
>>> (0 < 0) == 0
True
>>> 0 < (0 == 0)
True
Переведено автоматически
Ответ 1

В Python есть специальная обработка регистра для последовательностей реляционных операторов, упрощающая выражение сравнений диапазонов. Гораздо приятнее иметь возможность сказать0 < x <= 5, чем говорить (0 < x) and (x <= 5).

Они называются цепными сравнениями.

В других случаях, о которых вы говорите, круглые скобки заставляют применять один оператор отношения перед другим, и поэтому они больше не являются цепными сравнениями. И поскольку True и False имеют значения в виде целых чисел, вы получаете ответы, которые вы делаете, из версий, заключенных в скобки.

Ответ 2

Потому что

(0 < 0) and (0 == 0)

является False. Вы можете объединить операторы сравнения в цепочку, и они автоматически будут расширены до попарных сравнений.


РЕДАКТИРОВАТЬ -- разъяснение об True и False в Python

В Python True и False являются просто экземплярами bool, который является подклассом int. Другими словами, True на самом деле это всего лишь 1.

Смысл этого в том, что вы можете использовать результат логического сравнения точно как целое число. Это приводит к запутанным вещам, таким как

>>> (1==1)+(1==1)
2
>>> (2<1)<1
True

Но это произойдет, только если вы заключите сравнения в скобки, чтобы они оценивались первыми. В противном случае Python расширит операторы сравнения.

Ответ 3

Странное поведение, с которым вы сталкиваетесь, связано со способностью python связывать условия. Поскольку он обнаруживает, что 0 не меньше 0, он решает, что все выражение принимает значение false . Как только вы разбиваете это на отдельные условия, вы меняете функциональность. Изначально это, по сути, тестирование a < b && b == c для вашего исходного оператора a < b == c.

Another example:

>>> 1 < 5 < 3
False

>>> (1 < 5) < 3
True
Ответ 4
>>> 0 < 0 == 0
False

This is a chained comparison. It returns true if each pairwise comparison in turn is true. It is the equivalent to (0 < 0) and (0 == 0)

>>> (0) < (0 == 0)
True

This is equivalent to 0 < True which evaluates to True.

>>> (0 < 0) == 0
True

This is equivalent to False == 0 which evaluates to True.

>>> 0 < (0 == 0)
True

Equivalent to 0 < True which, as above, evaluates to True.

python