2013-05-11 63 views
6

我注意到的Python 2.7邏輯表達式的一個奇怪的現象:在地方的假奇怪的轉換表達式

 
>>> 0 and True 
0 
>>> True and 0 
0 
>>> 1 and True 
True 
>>> True and 1 
1 

 
>>> 0 and False 
0 
>>> False and 0 
False 
>>> 1 and False 
False 
>>> False and 1 
False 

,並與真有沒有在Python的轉換邏輯語句的任何規則整數?爲什麼它有時會顯示0虛假和1虛設爲真?

更重要的是,爲什麼它會返回?

 
>>>"test" or "test" 
'test' 
+1

'>>>布爾( 'X')''是TRUE' – 2013-05-11 11:27:42

回答

7

沒有被轉換; Python布爾邏輯運算符代替短路

boolean operators documentation

表達x and y首先評估x;如果x爲假,則返回其值;否則,將評估y並返回結果值。

表達式x or y首先評估x;如果x爲真,則返回其值;否則,將評估y並返回結果值。

此外,等於0的數字被認爲是錯誤的,正如空字符串和容器一樣。從相同的文檔引用:

在布爾操作的上下文中,以及當表達式通過控制流語句中使用的,下面的值被解釋爲假:FalseNone,所有類型的數字零,並且空字符串和容器(包括字符串,元組,列表,字典,集合和frozensets)。

結合這兩種行爲意味着,對於0 and False,所述0考慮假和評估False表達之前返回。對於表達式True and 0True進行評估並發現它是一個真實值,因此將返回0。就ifwhile和其他布爾運算符而言,該結果0也被認爲是錯誤的。

您可以使用它來提供例如默認值:

foo = bar or 'default' 

要真正轉換爲非布爾值轉換成布爾使用bool() type;它使用相同的規則布爾表達式來確定輸入的布爾值:

>>> bool(0) 
False 
>>> bool(0.0) 
False 
>>> bool([]) 
False 
>>> bool(True and 0) 
False 
>>> bool(1) 
True 

要完成圖片,未在布爾上下文認爲是假值,而不是真正的考慮,包括任何自定義類。您可以通過在班上實施.__nonzero__() special method來改變這種情況。如果沒有定義這樣的方法,也請諮詢​​。使用這兩種方法中的任何一種,您都可以發出信號,表明您的類型是數字,如果不是零,則應視爲True,或者它是一個容器,如果不是空(長度大於0),則應視爲True

+0

但是爲什麼「True和0」不是False,而是0? – 2013-05-11 11:44:32

+2

@ bzxcv17:同樣,短路;第一個表達式('True')是一個真值,因此返回第二個值。 「0」被認爲是錯誤的,所以就「if」和「while」以及其他布爾上下文而言,這是一個錯誤的值。 – 2013-05-11 11:46:06

2

這是因爲0本身就是s falsy值。

>>> bool(0) 
False 

>>> bool(1) 
True 

0 and True0因爲0是Falsy,AND條件作爲停止第一falsy值被發現,並返回該值一旦執行。如果所有值均爲True,則返回最右邊的值。

OR將繼續檢查值,直到第一True沒有找到否則返回最後一個值(righmtmost)

docs

任何對象都可以對真理值進行測試,使用if或while條件或下面的布爾操作的操作數。下面的值被認爲是假:

  • 任何數值類型的零,例如,0, 0L, 0.0, 0j

  • 任何空序列,例如,'',(), []

  • 任何空映射,例如,{}

  • 用戶定義類的實例,如果該類定義了__nonzero__()__len__()方法,則該方法返回整數零或布爾值False。

所有其他值被認爲是真實的 - 這麼多類型的對象總是如此。

除非另有說明,操作和具有布爾結果的內置函數始終返回0或False表示爲false,爲1或爲True。 (重要的例外:布爾操作或和,總是返回其操作數之一)

+0

和'>>>布爾(1)''是TRUE' – 2013-05-11 11:26:21

+0

@GrijeshChauhan啊!是的,還補充說。 – 2013-05-11 11:29:19

+0

Ashwini你也應該加上這個>>> >>> bool('x')是True'和'bool('')是False' – 2013-05-11 11:31:17

3

的Python總是返回操作數的一個對象

and返回第一個「假」對象或最後的「真實」的對象。

or返回第一個「true」對象或最終的「false」對象。

請注意,所有0,0.0,False,""被視爲「false」。

>>> "a" and "b" and "c" 
'c' 
>>> "a" or "b" or "c" 
'a'