3 回答

TA貢獻1852條經(jīng)驗 獲得超7個贊
什么都沒有被轉(zhuǎn)換;Python布爾邏輯運算符反而會短路。
請參閱布爾運算符文檔:
表達式
x and y
首先求值x
; 如果x
為false,則返回其值;否則為false。否則,y
將求值并返回結(jié)果值。表達式
x or y
首先求值x
; 如果x
為true,則返回其值;否則為false。否則,y
將求值并返回結(jié)果值。
此外,等于的數(shù)字0
以及空的字符串和容器都被認為是錯誤的。引用同一文檔:
在布爾運算的上下文中,以及當(dāng)控制流語句使用表達式時,以下值將解釋為false:
False
,,None
所有類型的數(shù)字零以及空字符串和容器(包括字符串,元組,列表,字典,集合和Frozensets)。
結(jié)合這兩種行為意味著,對于0 and False
,會0
被視為false并在評估False
表達式之前返回。對于表達式True and 0
,True
被求值并發(fā)現(xiàn)它是一個真值,因此0
將其返回。就if
andwhile
和其他布爾運算符而言,該結(jié)果0
也被認為是錯誤的。
您可以使用它來提供默認值,例如:
foo = bar or 'default'
要將非布爾值真正轉(zhuǎn)換為布爾值,請使用bool()
type;它使用與布爾表達式相同的規(guī)則來確定輸入的布爾值:
>>> bool(0)
False
>>> bool(0.0)
False
>>> bool([])
False
>>> bool(True and 0)
False
>>> bool(1)
True
為了使圖片更完整,在布爾上下文中不被視為false的值將被視為true,包括任何自定義類。您可以通過在類上實現(xiàn)一個.__nonzero__()特殊的方法來更改它。如果未定義此類方法,.__len__()則也請參考。使用這兩種方法中的任何一種,您都可以發(fā)出信號,表明您的類型是數(shù)字,并且True如果非零,則應(yīng)考慮該類型;或者,它是一個容器,并且True如果不為空(長度超過0),則應(yīng)考慮該類型。

TA貢獻1844條經(jīng)驗 獲得超8個贊
那是因為0它本身就是虛假的價值。
>>> bool(0)
False
>>> bool(1)
True
0 and True
是0
因為0
是Falsy,AND
條件一旦找到第一個falsy值便立即停止執(zhí)行并返回該值。如果所有值均為True,則返回最右邊的值。
OR
將繼續(xù)檢查值,直到True
找不到first為止,否則它將返回最后一個值。
來自docs
:
可以測試任何對象的真值,以在if或while條件中使用,或用作以下布爾運算的操作數(shù)。以下值被認為是錯誤的:
沒有
錯誤的
任何數(shù)字類型的零,例如
0, 0L, 0.0, 0j
。任何空序列,例如
'', (), []
。任何空映射,例如
{}
。用戶定義的類的實例,如果該類定義了
__nonzero__()
或__len__()
方法,則該方法返回整數(shù)零或布爾值False時。
所有其他值都被認為是真實的-因此許多類型的對象總是真實的。
除非另有說明,否則具有布爾結(jié)果的操作和內(nèi)置函數(shù)始終返回0或False表示false,返回1或True表示true。(重要的例外:布爾運算符or和and始終返回其操作數(shù)之一。)
添加回答
舉報