2012-10-21 160 views
4

這可能是簡單的愚蠢,但對我來說這是一個有點混亂:空列表布爾值

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==False回報FalseFalse == False回報True

+2

Python比較是強類型的:[不同類型的對象...永遠不會比較相等](http://docs.python.org/library/stdtypes.html)。這就是爲什麼'l == False'失敗。 – georg

回答

21

您正在根據布爾值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(顯然)
  • 任何空序列:''[]()
  • 任何「零」值:0,0.0
  • 任何空集合:{}(空字典)
  • 任何其len()返回0

這些被稱爲 「falsey」 值。 其他一切都是「真實的」。從而導致一些類似怪事:

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

它也是很好的在此指出,的方法不返回一個明確的值,總是有None作爲其返回類型,導致此:

>>> def bar(): 
... x = 1+1 
... 
>>> bool(bar) 
True 
>>> bool(bar()) 
False 
+0

謝謝。正如你可能注意到的那樣,它開始討論的是關於如果你可以用「if l:」替換「if len(l):」的話。 – root

+0

空集合與具有「len()」的0相同。適用於列表,元組,集合和字典。 – hughdbrown

+0

你是對的,但它在[documentation](http://docs.python.org/library/stdtypes.html)中明確提到的原因是爲了澄清任何實現'__len __()'並返回' 0「將被視爲」Falsey「。 –

4

空列表是不一樣的False,但False等於False,因爲它是同一個對象。 bool(l)返回False,因爲空列表是「虛假」。

總之,==不是bool() == bool()

例如,[1, 2] == [1, 2, 3]False,即使兩者是「真正的」。

1

這是因爲空列表不是False,它只是「falsy」當被評估的一個或if條件while(兩者評估bool轉換其狀態的)當轉換爲一個bool,或。有關更多詳細信息,請參閱documentation on Truth Value Testing