Why does the expression 0 < 0 == 0 return False in Python?
Почему выражение 0 < 0 == 0 возвращает False в Python?
Заглядывая в Queue.py в Python 2.6, я обнаружил эту конструкцию, которая показалась мне немного странной:
deffull(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?
В 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.