16

これは単にばかげているかもしれませんが、私にとっては少し混乱しています:

In [697]: l=[]

In [698]: bool(l)
Out[698]: False

In [699]: l == True
Out[699]: False

In [700]: l == False
Out[700]: False 

In [701]: False == False
Out[701]: True

なぜl==Falsereturn Falsewhile False == Falsereturns True?

4

3 に答える 3

41

boolean のリテラル値に対してチェックしていますFalse。同じ'A' == Falseことはありません。

キャストすると、違いがわかります。

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

その理由False == Falseは、同じオブジェクトを比較しているためです。2 == 2またはと同じ'A' == 'A'です。

if l:困難は、このチェックに合格しないようなものを見ると起こります。これは、アイテムの真価をチェックしているためです。慣例により、これらの項目はすべてブール値チェックに失敗します。つまり、ブール値は次のようになりますFalse

  • None
  • False(明らかに)
  • 空のシーケンス: '', [],()
  • 任意の「ゼロ」値: 00.0など。
  • 空のコレクション: {}(空の辞書)
  • len()返すものすべて0

これらは「偽の」値と呼ばれます。それ以外はすべて「真」です。これは、次のような奇妙なことにつながる可能性があります。

>>> def foo():
...   pass
...
>>> bool(foo)
True

ここで、明示的な値を返さないメソッドは常にNone戻り値の型を持っていることに注意してください。これにより、次のようになります。

>>> def bar():
...   x = 1+1
...
>>> bool(bar)
True
>>> bool(bar())
False
于 2012-10-21T11:21:57.733 に答える
8

空のリストは と同じではありませんがFalse、同じオブジェクトであるためFalse同等です。空のリストは「偽」であるため、戻ります。Falsebool(l)False

要するに、で==はありませんbool() == bool()

たとえば、2 つが「本当に」であっても[1, 2] == [1, 2, 3]isです。False

于 2012-10-21T11:22:51.867 に答える
3

これは、空のリストが ではないためです。 に変換されたとき、または anまたは条件 (どちらも条件の変換を評価します) によって評価されたときFalseは、単に「偽」です。詳細については、Truth Value Testing に関するドキュメントを参照してください。boolifwhilebool

于 2012-10-21T11:23:06.620 に答える