Ассоциативность операторов сравнения в Python

Какова ассоциативность операторов сравнения в Python? Это просто для трех сравнений, но для большего я не уверен, как это делается. Они не кажутся право- или лево-ассоциативными.

Например:

>>> 7410 >= 8690 <= -4538 < 9319 > -7092        
False    
>>> (((7410 >= 8690) <= -4538) < 9319) > -7092 
True

Значит, не левоассоциативный.

>>> 81037572 > -2025 < -4722 < 6493           
False
>>> (81037572 > (-2025 < (-4722 < 6493)))     
True

Так что это тоже не правильно-ассоциативно.

Я видел некоторые места, где они «сцеплены», но как это работает с четырьмя или более сравнениями?


person John Doe    schedule 12.09.2015    source источник


Ответы (3)


Сцепленные сравнения расширяются с помощью and, поэтому:

a <= b <= c

становится:

a <= b and b <= c

(но b оценивается только один раз). Это объясняется в справочнике по языку сравнения.

Обратите внимание, что ленивое вычисление означает, что если a > b, результатом будет False, а b никогда не сравнивается с c.

Ваши версии со скобками совсем другие; a <= (b <= c) будет оценивать b <= c, а затем сравнивать a с результатом этого, and вообще не участвует, поэтому сравнивать результаты для определения ассоциативности не имеет смысла.

person jonrsharpe    schedule 12.09.2015

логические тесты коротких замыканий python слева направо:

7410>=8690<=-4538<9319>-7092        -> False

7410>=8690 это False. это оно. остальные тесты не проводились.

Обратите внимание, что

True == 1
False == 0

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

(((7410>=8690)<=-4538)<9319)>-7092
      False   <=-4538
            False     <9319
                    True  >-7092
                         True
person hiro protagonist    schedule 12.09.2015

Вы делаете ошибку с типами, когда вы пишете 81037572>-2025, система считает это True или False и связывает с 1 и 0. Поэтому затем он дает вам сравнение с этими двоичными числами.

person Cedric    schedule 12.09.2015
comment
Я понимаю, что они возвращают логические значения. Python использует логические значения как целые числа во время сравнения. Так, например, 1‹2‹3‹4‹5 дает истинный результат, а 1›2›3›4›5 возвращает ложь. Я знаю, что он не вернет математически правильный результат. Это были просто примеры, я просто спрашиваю, как именно они интерпретируются. В каком порядке. - person John Doe; 12.09.2015
comment
Насколько я понимаю, справа налево. Так как 0 < 3 < 2возвращает False - person Cedric; 12.09.2015
comment
Если бы это было так, то 0‹=1›2 было бы истинным. - person John Doe; 12.09.2015
comment
0 <= 1 > 2 оценивается как 0 <= 1 and 1 > 2 --> True and False --> False - person jonrsharpe; 12.09.2015