35

リストが空かどうかをチェックするPythonicの方法は次のとおりであることを知っているので、私はこれを求めています:

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

4 に答える 4

57

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

ifステートメントによって物事がどのように評価されるかを実際に確認する方法は次のとおりです。

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

真理値テストのドキュメントを参照してください。空のリストはfalseと見なされますが、これは、と同等であるという意味ではありませんFalse

PEP 285には、なぜこのように実装されたのかについての優れた情報もあります。具体的に扱っている部分については、「解決された問題」セクションの最後の箇条書きを参照してください。x == Truex == False

私にとって最も説得力のある側面は、一般的に==推移的であるということです。したがって、それがあなたが期待した方法であり、真実であり、真実である場合、それは真実であるはずであると考えるかもしれません(暗黙の型変換のない言語であってはならないことは明らかですが)。a == bb == ca == c[] == False'' == False[] == ''

于 2012-05-03T23:37:48.637 に答える
14

空のコンテナは「偽」です。つまりFalse 、ブールコンテキストで評価されます。それは、それらが文字通り定数に等しいという意味ではありませんFalse

言い換えれば、以下は次のとおりですTrue

bool([]) == False

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

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

しかし、あなたの心を吹き飛ばすために、以下は次のとおりですTrue

False == 0

これは、ブール値がPythonの整数のサブクラスであり、False基本的には少し異なる方法で出力されるゼロであるためです。

于 2012-05-03T23:38:50.820 に答える
7

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

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

于 2012-05-03T23:40:01.150 に答える
3

あなたの例では、not演算子がリストをブール値に変換しています。これを試して:

>>> not []
True

>>> not [1]
False

「is」と「==」はその変換を行いません。

于 2012-05-03T23:44:04.083 に答える