2012-02-14 8 views
143

this questionへの回答を見ていると、自分の答えを理解できませんでした。([1,0] == Trueの1)がFalseに評価されるのはなぜですか?

これはどのように解析されているのか分かりません。なぜ2番目の例はFalseを返しますか?

>>> 1 in [1,0]    # This is expected 
True 
>>> 1 in [1,0] == True  # This is strange 
False 
>>> (1 in [1,0]) == True # This is what I wanted it to be 
True 
>>> 1 in ([1,0] == True) # But it's not just a precedence issue! 
          # It did not raise an exception on the second example. 

Traceback (most recent call last): 
    File "<pyshell#4>", line 1, in <module> 
    1 in ([1,0] == True) 
TypeError: argument of type 'bool' is not iterable 

ありがとうございました。私は本当に明白な何かを見逃しているに違いないと思う。

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


私は、これはリンクの重複に微妙に異なっていると思います。

両方の質問は、表現の人間の理解と関係がある。表現を評価するには2つの方法があるように思えた。もちろんどちらも正しいわけではありませんが、私の例では、最後の解釈は不可能です。 0 < 0 == 0を見ると

あなたが表現としてそれぞれ評価されている半分となって感覚を想像することができます:これはFalse評価理由

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

ので、リンクの答え:

>>> 0 < 0 == 0 
False 

しかし、私の例1 in ([1,0] == True) doesnのと式として意味をなさないので、2つの(間違っていると思われる)2つの解釈の代わりに、1つのみが可能です:

>>> (1 in [1,0]) == True 
+1

演算子の優先順位... '=='は 'in'よりも厳密にバインドするので、' [1,0] == True'が最初に評価され、その結果は 'other_result'の' 1 'に送られます。 –

+0

Python 3.2は同じ方法で動作するため、Python-2.7タグを削除しました。 – lvc

+1

@Marc B:2番目の式 –

答えて

180

ここで比較演算子の連鎖が実際に適用されます。この表現は、

(1 in [1, 0]) and ([1, 0] == True) 

に翻訳されており、これは明らかにFalseです。

これも(2回bを評価せずに)

(a < b) and (b < c) 

に変換

a < b < c 

ような表現のために起こります。

詳細については、Python language documentationを参照してください。

+34

これに加えて、[1、[1、0] == [1、0] 'は' True'と評価されます。 –

+0

'[1,0] == True'では1ではない... – ChessMaster

+8

私はこれを言語疣贅として考えてきました。私は、 'in'演算子が他の比較演算子よりも優先順位が高く、チェーン化されていないことを好みました。しかし、たぶん私はユースケースを欠いています。 –

関連する問題