2011-01-07 2 views
1

式の内容は何ですか?"word" in [] == Falseは解析されていますか?Pythonのパーサーの複雑さ

>>> "word" in [] == False 
False 
>>> ("word" in []) == False 
True 
>>> "word" in ([] == False) 
TypeError 

Pythonは実際にこの式をどのように解釈しますか?それをどう解釈するのですか?

編集:

最も一般的な場合には、通常、あなたがthis table.と演算子の優先順位を見つけることができ

>>> any_value in any_list == any_symbol_or_value 
False 
+0

例外的に正当な理由がない限り、「真」または「偽」と比較しないでください。 Pythonだけでなく、すべての言語に対応しています。より多くのコードを追加しても、必ずしも明確なことが明らかになるわけではありません。 –

答えて

1

word in []は暗黙的なandのために最初の式を短絡しています。それが偽であることを認識すると、残りの式の評価が中止されます。これは[](同じエンティティでwordがテストされたばかりのもの)と値Falseです。 []Falseと等しくないので、暗黙の「and」式は偽です。予想通り

("word" in []) == False作品()は、サブ句仕上げを行い、Falseに比べてその結果を持っているので。

もちろん、[]Falseと等しくありません。


最初のケースを明確にするために、あなたはこのようにそれをテストすることがあります

foo = [] 

if ("word" in foo) and (foo == False): 
    print "True" 
else: 
    print "False" 

これは何が起こっているのか、機能的に、です。

+1

'[]'は '' False''( '==')と同じではありませんが、言語によって保証されているように 'bool([])'が 'False'となるよう' '] * * 。 (これはこのOPの例を複雑にしませんが、あなたの回答の一部が不完全またはあいまいになることはほとんどありません) –

+0

あなたのロジックを使用して、「1」と「1」が同じであると正当に言うこともできますなぜなら 'int(" 1 ")== 1'は言語によって保証されているように' True'であるからです。 '[]'は 'False'とまったく同じです。なぜなら、' '1 ''は '1'とは異なるからです。 Pythonは動的であるが強く*タイプされていることを覚えておいてください。 – syrion

+0

@syrion:明示的な変換を使用していないことを除いて(私はそれを明確にするためにこれを行っただけです)。 'foo = [];を実行すると、 if foo: 'は、' foo'がfalseであるかのように評価されます。これは、(空の)コンテナの動作の重要な部分です。 '' 1 ''は暗黙的に整数にキャストされることはありませんが、コンテナは常に暗黙的にbooleanにキャストされます。 –

10

のようです。

しかし、これは実際には難しい例である:

比較は、例えば、X < Y < = zが そのYを除いて、X < YおよびY < = Zに相当 ある、任意 を連鎖させることができます( では、では、x <が偽であると判断された場合、両方のケースのzは全く評価されません)

See the notes on comparisons.

ので"word" in [] == Falseは、実際には2つの[]が実際に同じオブジェクトである

("word" in []) and ([] == False) 

です。

これは他の比較、つまり0 < a < 10に便利ですが、ここでは本当に混乱します。

+0

これはより正確な答えであり、syrionの回答よりもはるかに早く与えられた –

+0

両方の回答は最初の投稿の後に編集されました。私が鉱山を提出すると、「このテーブルを使って見つけることができます。この場合、関係するすべての演算子が同じ優先順位を持つことがわかります。式は単に左から右に評価されます」 – syrion

+0

@gnibbler私は一般的に、人々が最初に短い、あいまいな答えを与えて、自分自身を時系列的に安全にし、後でそれを編集して、あなたのような人々が時系列に基づいてその答えを無理なく受け入れるように、 – ppalka