なぜPythonでそれはこのように評価されます:
>>> False is False is False
True
しかし、括弧で試してみると、期待どおりに動作しています。
>>> (False is False) is False
False
a is b is c
のような連鎖演算子はa is b and b is c
と同等です。
したがって、最初の例はFalse is False and False is False
であり、これはTrue and True
に評価され、True
に評価されます。
括弧を付けると、ある評価の結果が次の変数と比較されることになります(ご想像のとおり)。したがって、(a is b) is c
はa is b
の結果をc
と比較します。
引用 Python公式ドキュメント 、
正式には、
a
、b
、c
、...、y
、z
が式であり、op1
の場合、op2
、...、opN
は比較演算子であり、a op1 b op2 c ... y opN z
はa op1 b and b op2 c and ... y opN z
と同等ですが、各式が最大で1回評価される点が異なります。
したがって、False is False is False
は次のように評価されます。
(False is False) and (False is False)
2番目のFalse is False
式は、元の式の2番目のFalse
を使用します。これは、効果的に次のように変換されます。
True and True
そのため、最初の式はTrue
であると評価されます。
ただし、2番目の式では、評価順序は次のようになります。
(False is False) is False
これは実際には
True is False
そのため、結果はFalse
になります。
あなたの表現
False is False is False
として扱われます
(False is False) and (False is False)
だからあなたは得る
True and True
そしてそれはTrue
に評価されます。
この種の連鎖は、他の演算子でも使用できます。
1 < x < 10
False is False is False
手段 (False is False) and (False is False)
、 だが (False is False) is False
手段 :
>>> (False is False) is False
False
>>> a_true = (False is False)
>>> a_true
True
>>> a_true is False
False
だから、あなたは結果を得る。
>>> False is False is False
True
この場合、False
ペアのそれぞれが評価されます。最初の2つのFalseが評価され、それがTrue
の場合、2番目と3番目のFalse
が評価され、結果が返されます。
この場合、 False is False is False
は、2つのコマンドの結果のand
に相当しますFalse is False