3

重複の可能性:
Pythonで式0 <0 == 0がFalseを返すのはなぜですか?

Python 2 REPLからの次の出力は、私を混乱させます。

>>> 15>10==True
False
>>> 15>1==True
True
>>> 15>2==True
False
>>> 15>False
True

15>10==Trueがとして評価される場合(15>10)==True、式はに単純化されprint True==True、これは明らかにに評価されTrueます。15>10==Trueがで評価される場合15>(10==True)、式は単純化され、15>Falseこれもに評価されTrueます。これらの解釈は両方とも、式(False)の実際の値と矛盾します。

なぜなら、それが真実であると15>1==True評価することは理解できますが、解釈は私には意味がありません。True1==True15>10==True

概要: Python 2では、なぜ15>10==True評価されるのFalseですか?

4

2 に答える 2

5

これは、Pythonでの連鎖比較のためです。つまり、15>10==True実際には次のように評価されます。

15 > 10 and 10 == True

これはFalseです。

一方、はと15>1==True同じです

15 > 1 and 1 == True

これはに評価されTrueます。


ドキュメントから引用するには:

Cとは異なり、Pythonのすべての比較演算の優先度は同じであり、算術演算、シフト演算、またはビット演算よりも低くなります。また、Cとは異なり、a <b <cのような式には、数学で一般的な解釈があります。

comparison    ::=  or_expr ( comp_operator or_expr )*
comp_operator ::=  "<" | ">" | "==" | ">=" | "<=" | "<>" | "!="
                   | "is" ["not"] | ["not"] "in"

比較すると、ブール値(TrueまたはFalse)が生成されます。

比較は任意に連鎖させることができます。たとえば、x <y<=zはx<yおよびy<=zと同等ですが、yは1回だけ評価されます(ただし、どちらの場合も、x <yが見つかった場合、zはまったく評価されません。偽であるために)。

正式には、a、b、c、...、y、zが式で、op1、op2、...、opNが比較演算子の場合、op1 b op2 c ... yopNzはop1bと同等です。およびbop2cおよび...yopN z。ただし、各式は最大で1回評価されます。

op1 b op2 cは、aとcの間のいかなる種類の比較も意味しないことに注意してください。したがって、たとえば、x <y> zは完全に合法です(おそらくきれいではありませんが)。

于 2012-10-31T00:52:21.847 に答える
2

私はあなたが無意識のうちにPython演算子の「きちんとした」機能に遭遇していると信じています:

Cとは異なり、a <b <cのような式には、数学で一般的な解釈があります。

In [12]: 15>10==True
Out[12]: False

Trueは、この式ではたまたま1として扱われます。つまり、次のようになります。

In [13]: 15>10==1
Out[13]: False

しかし、次に==を>演算子で置き換えると、上記のルールに従って新しい式がどのように真であるかがわかります。

In [14]: 15>10>1
Out[14]: True
于 2012-10-31T00:53:47.873 に答える