(1 in [1,0] == True)がFalseと評価されるのはなぜですか?


153

この質問の答えを見ていたとき、自分の答えが理解できませんでした。

これがどのように解析されるのか、私にはよくわかりません。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

助けてくれてありがとう。私は本当に明白な何かを見逃しているに違いないと思います。


これはリンクされた複製とは微妙に異なると思います:

Pythonで式0 <0 == 0がFalseを返すのはなぜですか?

どちらの質問も、人間の表現の理解に関係しています。表現を評価するには2つの方法(私の考えでは)があるようです。もちろんどちらも正しくありませんでしたが、私の例では、最後の解釈は不可能です。

見てみると、0 < 0 == 0各半分が評価され、式として意味を成していることが想像できます。

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

だからリンクはこれがなぜ評価されるのか答えますFalse

>>> 0 < 0 == 0
False

しかし、私の例で1 in ([1,0] == True)は式として意味をなさないので、2つの(確かに間違っている)可能な解釈があるのではなく、1つだけが可能であると思われます。

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

1
演算子の優先順位... ==バインドはよりも強いinため[1,0] == True、最初に評価され、次にその結果がに渡され1 in other_resultます。
マークB

Python 3.2は同じように動作するため、Python-2.7タグを削除しました。
lvc

1
@マークB:2番目の表現を説明しない
スコットハンター

32
@MarcB、質問には括弧を使用してその解釈を反証するテストが含まれていました。
Mark Ransom

回答:


194

Pythonは実際にここで比較演算子の連鎖を適用します。式は次のように翻訳されます

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

明らかにFalseです。

これは、次のような式でも発生します

a < b < c

これは

(a < b) and (b < c)

b2回評価せずに)。

詳細については、Python言語のドキュメントを参照してください。


40
これに対する追加の証明は、と1 in [1, 0] == [1, 0]評価されTrueます。
アンドリュークラーク

9
私はこれを言語のいぼとして長い間考えてきました。in演算子が他の比較演算子よりも優先順位が高く、連鎖しないことが望ましいと思います。しかし、おそらく私はユースケースを見逃しています。
Steven Rumbalski、2012

3
いいキャッチ、私もそのことを考えていませんでした。連鎖を許可することはあまり意味がありませんin-結局x < y < zは意味がありますが、x in y in z
BlueRaja-Danny Pflughoeft

7
@Sven Useful:たぶん。読みやすい:間違いなく。Pythonは、この規則を使用して一般的な数学的タイポグラフィをエミュレートすることを目的としていますが、これを使用するinと、もはやそうではなくなり、直感に反するようになります。
Konrad Rudolph

6
@KonradRudolph:数学のテキストで「1≤x∈ℝ」のように思われるのを何度か見たことがありますが、基本的にはあなたに同意します。
Sven Marnach
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.