2012-05-03 18 views
26

私はリストが空であるかどうかをチェックするための神託の方法は、以下であることを知っているので、私はこれを聞いてるのよ:「[] == False」は、「[]が成功しなかった場合、Falseに評価されるのはなぜですか?

my_list = [] 
if not my_list: 
    print "computer says no" 
else: 
    # my_list isn't empty 
    print "computer says yes" 

computer says noなどが印刷されますので、これはFalse真実で[]を識別するために私をリード値。私は[]を比較しようとFalse "直接" しかし、もし、私は次を得る:

>>> my_list == False 
False 
>>> my_list is False 
False 
>>> [] == False 
False 

等...

ここで何が起こっているの?私は本当に明白な何かを見逃しているように感じる。

+4

これは、プログラマが 'if variable == True:'句を使用しないようにする優れた設計です。変数がTrueの場合、 '' True(それはまったく真であり、他のものではない - ほとんどの場合、最良の方法ではない)、 ''もし変数ならば(真理値-y)のいずれかでなければなりません。 – Darthfett

答えて

49

ifステートメントは、ブールコンテキストのすべてを評価します。bool()組み込み関数への暗黙の呼び出しのようです。ここで

は、あなたが実際に物事がif文によって評価されるかをチェックする方法を次のとおりです。

>>> bool([]) 
False 
>>> bool([]) == False 
True 

Truth Value Testing上のドキュメントを参照してください、空のリストは偽と考えありますが、これは彼らが意味するものではありませんFalseに相当します。

PEP 285も、それが具体的にx == Truex == Falseを扱う部分の解決済みの問題セクションの最後の箇条書きを参照してください、この方法で実装された理由のいくつかの優れた情報を持っています。

==は一般に推移的であるため、a == bb == ca == cを意味します。だから、もしあなたが期待した通りで、[] == Falseが真で'' == Falseが真だったら、[] == ''が本当であるはずです(明示的な型変換なしの言語ではないはずですが)。

+18

"明らかにそうであってはいけませんが、" *** Javascript ***。 –

13

空のコンテナは「偽」です。つまり、ブールコンテキストでFalseと評価されます。それは文字通り一定のFalseと等しいことを意味しません。すなわち

、以下をTrueある:

bool([]) == False 

オブジェクトの真理値は、その__nonzero__()又はその__len__()方法によって決定されます。 (Python 3では__nonzero__()の名前が__bool__()に変更されました。)コンテナには__len__()というメソッドがあります。したがって、コンテナには何かがあり、空のときは偽ります。

空のコンテナが文字どおりFalseに等しい場合、空のコンテナは他の空のコンテナと同じになります。たとえば、{} == ""Trueとなります。そして、それはまったく意味がありません!

しかし、ちょうどあなたの心を爆破するために、以下のTrueです:

False == 0 

ブール値は、Pythonでの整数のサブクラスである、とFalseは、基本的には少し異なる印刷されますちょうどゼロであるためです。

7

Pythonの組み込み型には真偽値をテストできる真理値があります。 Truth Value Testingを参照してください。

これは、実際のバリューテスト(平等テスト)を行っているobject == Falseとは異なります。オブジェクト__eq__()メソッドを使用して、その値が等しいかどうかを判断しています。

+0

これは個人的に最も有用な答えです。真実性は興味深い概念であり、直感的ではない結果につながる可能性があります。 JavaScriptを例に取ってみましょう。 – dwerner

+1

@dwerner:そうだね。私はちょうど 'オブジェクトが内容を持っているかどうか 'を' if object: 'として考えてみることにします。 – jdi

3

例では、not演算子はリストをブール値に変換しています。これを試してみてください:

>>> not [] 
True 

>>> not [1] 
False 

"は"、 "=="は変換しません。

+3

これは、' not'演算子がブール値に変換されているが本当に良い点です。 '(not [])== True'と'(not [1])== False'です。 –

+0

ありがとうございます。私はそれを修正します。 –

関連する問題