直到 Python 3.5,文檔仍然說(強調我的):4.1.?真值檢驗可以測試任何對象的真值,用于 if 或 while 條件或作為下面布爾運算的操作數。以下值被認為是錯誤的:NoneFalse任何數字類型的零,例如0,?0.0,?0j。任何空序列,例如'',?(),?[]。任何空映射,例如{}.用戶定義類的實例,如果該類定義了一個__bool__()或__len__()方法,當該方法返回整數零或bool?值時False。[1]所有其他值都被認為是真實的——所以許多類型的對象總是真實的。除非另有說明,否則具有布爾結果的操作和內置函數始終返回0or?Falsefor false 和1or?Truefor true。(重要的例外:布爾運算or總是and返回它們的操作數之一。)一個非空列表 like[5]不屬于上面列表中的任何內容,因此“所有其他”指定它是真的。但從 Python 3.6 開始,它就消失了。該部分現在說:真值檢驗可以測試任何對象的真值,用于iforwhile?條件或作為下面布爾運算的操作數。默認情況下,一個對象被認為是真實的,除非它的類定義了一個返回零的__bool__()方法,當用該對象調用時。[1] 以下是大多數被認為是 false 的內置對象:False__len__()常量定義為假:None和False。任何數字類型的零:0,?0.0,?0j,?Decimal(0),Fraction(0, 1)空序列和集合:'',?(),?[],?{},?set(),range(0)除非另有說明,否則具有布爾結果的操作和內置函數始終返回0or?Falsefor false 和1or?Truefor true。(重要的例外:布爾運算or總是and返回它們的操作數之一。)Now[5]可能有一個__bool__()返回 的方法False,因此它是錯誤的。當前文檔中是否有新的地方以某種方式指定非空列表為真?
3 回答

忽然笑
TA貢獻1806條經驗 獲得超5個贊
所有內置類的文檔都列出了它們實現的所有特殊方法。如果未列出某個方法,則可以假定它未實現。
由于 的文檔list
沒有說明重寫該__bool__
方法,因此它繼承了默認行為。

陪伴而非守候
TA貢獻1757條經驗 獲得超8個贊
剛剛在參考資料中找到了一個地方(強調我的):
6.11.?布爾運算
[...]
在布爾運算的上下文中,以及當控制流語句使用表達式時,以下值被解釋為假: , ,
False
所有None
類型的數字零,以及空字符串和容器(包括字符串、元組、列表、字典、集合和冷凍套裝)。所有其他值都被解釋為 true。?用戶定義的對象可以通過提供?__bool__()
方法來自定義它們的真值。
令我有點困擾的是,這與下一句有關用戶定義對象的內容立即矛盾,但我會接受。

暮色呼如
TA貢獻1853條經驗 獲得超9個贊
[5]
是一個list
對象。除非您專門覆蓋了內置__bool__
方法,否則您將獲得默認方法。正如文檔已經暗示的那樣,這是Truthy。
更新并沒有改變太多,只是擴大了解釋以涵蓋派生類型和內置類型的其他擴充。
添加回答
舉報
0/150
提交
取消