2016-12-06 53 views
1
>>> 5 in [1, 2, 3, 4] == False 
False 

は、私は、これはメンバーシップをテストするための奇妙な方法であることを取得し、なぜこれはアレイメンバーシップテストとして機能しませんか?

>>> 5 not in [1, 2, 3, 4] 
True 

ことを「正しい」方法です。どのような私を混乱は、その動作が異なっているということです

>>> 5 in ([1, 2, 3, 4] == False) 
TypeError ... 

は、私が何かを明らかに見逃している

>>> (5 in [1, 2, 3, 4]) == False 
True 

と両方? (Python 2.7とPython 3.4でテスト済み)。

明確にするために、私は最後の3つのスニペットを理解しています。私はの最初のスニペットの動作について質問しています。なぜそれが違うのですか?

+3

これは間違いなくドゥープですが、適切なドゥープ候補を見つけることができません。 – user2357112

+0

OK ...それで、どうやって詐欺だと分かっていますか? –

+0

@ user2357112 - [これ(http://stackoverflow.com/questions/34824578/python-in-operator-is-not-working)は近いようです。 – TigerhawkT3

答えて

3

これは連鎖比較です。あなたはPythonで

1 < 2 < 3 

を行うことができますことを知っていること、そしてそれが(1 < 2) and (2 < 3)に相当します。 (あるいは、あなたは知っていませんでした。)まあ、同じことがin==に当てはまります。

5 in [1, 2, 3, 4] == False 

[1, 2, 3, 4]Falseに等しくないので、全体の発現はFalseに評価

(5 in [1, 2, 3, 4]) and ([1, 2, 3, 4] == False) 

と等価です。

+0

恐ろしい!私は連鎖比較について知っています。私は彼らが 'に'に適用されたことを認識していませんでした。いい答えだ! –

+0

これは一般的なワットです。文字通り*比較*として定義されているので、実際には[比較演算子](https://docs.python.org/3/library/stdtypes.html#comparisons)として文書化された 'in 'と' not in'を取得しようとしました[grammar](https://docs.python.org/3/reference/grammar.html)にありましたが、bugs.python.orgに多くのサポートを得ていません – wim

+0

私はドキュメントの不足をバグレポートにすることを考えていましたあまりにも。私はそれが失われた原因だと思う。なぜそれが比較演算子なのか?この動作が有用な場合は私は考えることができません。 –

関連する問題