2012-08-09 117 views
9

我已經遇到了一些代碼,上面寫着:Python中的if bool(x)`和if x`有什麼區別嗎?

if bool(x): 
    doSomething 

我認爲,以下將做同樣的工作:

if x: 
    doSomething 

The reference說,它評估套件,如果測試表達式

被發現是真的

基準表示布爾表達式的:

在布爾操作的上下文中,以及當表達時通過控制流語句用於通過控制流語句 ,下面的值被解釋爲 假:假,無,所有類型的數字零以及空字符串和容器...所有其他值都被解釋爲true。

referencebool()功能:

一個值轉換爲一個布爾值,使用標準的事實測試程序

所以是兩個以上相同的或者是有一些額外的對它微妙?

+1

只需點擊文檔中有關if的第一個鏈接,即可獲得答案。 – phant0m 2012-08-09 14:15:24

+2

我知道這個參考文獻的含義。這就是我引用它的原因。正如參考文獻所說,這不是一個規範,我在問我的文檔閱讀是否正確。 – Joe 2012-08-09 14:17:14

+0

不,它鏈接到_ _nonzero()_ _ – phant0m 2012-08-09 14:18:47

回答

7

if將使用__nonzero__()(如果可用),如爲bool()測試真值時。所以,行爲是等價的。

從文檔:

在布爾操作的上下文中,以及當表達式是通過控制流語句使用 ,下面的值被解釋 爲假:虛假,無,所有的數字零類型和空字符串 和容器(包括字符串,元組,列表,字典,集合 和frozensets)。所有其他值都被解釋爲true。 (換一種方式來改變這種見 __nonzero__()特殊的方法。)

object.__nonzero__(self)

調用,實現真值測試和內置操作bool();應該返回虛實,或其整數等同於0或 1.如果未定義此方法,則調用__len__()(如果已定義),並且如果該對象的結果非零,則該對象被視爲真。 如果一個類既沒有定義__len__()也沒有定義__nonzero__(),它的所有 實例都被認爲是真實的。

+1

這不是第一個答案,但它確實包含了一個分類鏈接'if'和'bool()'函數,所以標記正確。 – Joe 2012-08-09 14:23:26

+2

'__nonzero__'在python 3.x中被稱爲'__bool__'。 – Darthfett 2012-08-09 17:09:49

14

將對象置於if語句中時,它們會隱式轉換爲bool類型。因此,在大多數情況下,在if聲明中xbool(x)之間沒有區別。但是,如果您撥打bool()因爲您正在進行函數調用,則會產生額外的開銷。這裏有一個快速測試來證明這一點:

In [7]: %timeit if(''): pass 
10000000 loops, best of 3: 21.5 ns per loop 

In [8]: %timeit if(bool('')): pass 
1000000 loops, best of 3: 235 ns per loop 
+2

你的代碼有不匹配的循環跳棋......一個是10,000,000另一個是1,000,000 – 2012-08-09 14:17:29

+6

@InbarRose:不,這只是多少次「循環」。它決定在第二種情況下做得更少,因爲它慢了10倍。 「每循環」是重要的數字。 – DSM 2012-08-09 14:17:54

+0

@DSM哦,好的:) – 2012-08-09 14:18:32

3

,你把在if語句中的任何對象將轉換成基於一些內部蟒蛇檢查一個布爾值,通常不是一個問題,有bool(x)(x)沒有什麼區別當在if聲明中時。

然而,bool(x)存在的原因是例如:

return bool(x)

這將基於所述對象返回 「truefalse」。

0

Afaik沒有區別,如果x是'',None,0或False,它將被轉換爲False。

+1

並且'[]'和'{}'和'set()'和...列表繼續。 (任何對象都可以用'__nonzero__'方法(或者Python 3的'__bool__')來定義,這可以控制'if x'的行爲。) – huon 2012-08-09 19:46:54

相關問題