Python 使用bool型別來表示 true 和 false 值,這個型別是int的子類別。
這個型別裡只有兩個布林值:True和False。
這些值可以指定給變數,也可以與布林運算子(and、or、not)結合:
>>> true_variable = True and True
>>> false_variable = True and False
>>> true_variable = False or True
>>> false_variable = False or False
>>> true_variable = not False
>>> false_variable = not True
布林運算子使用_短路求值_,這表示運算子右側的運算式只會在需要時才被求值。
每個運算子的優先順序都不同,其中not會比and和or先求值。
括號可以用來讓運算式的某個部分比其他部分先求值:
>>> not True and True
False
>>> not (True and False)
True
所有boolean operators的優先順序都低於 Python 的comparison operators,例如==、>、<、is和is not。
bool函式(bool())會把任何物件轉換成布林值。
預設情況下,所有物件都會回傳True,除非它被定義為回傳False。
有幾個built-ins依定義一律被視為False:
None和False
int、float、complex、decimal或fraction)str、list、set、tuple、dict、range(0))>>> bool(None)
False
>>> bool(1)
True
>>> bool(0)
False
>>> bool([1,2,3])
True
>>> bool([])
False
>>> bool({"Pig" : 1, "Cow": 3})
True
>>> bool({})
False
當物件被用在_布林情境_中時,會透過bool()以透明的方式評估它是_真值_還是_假值_:
>>> a = "is this true?"
>>> b = []
# This will print "True", as a non-empty string is considered a "truthy" value
>>> if a:
... print("True")
# This will print "False", as an empty list is considered a "falsey" value
>>> if not b:
... print("False")
類別只要覆寫並實作__bool__()方法,或是__len__()方法(或兩者),就可以定義自己在真值情境下的評估方式。
bool型別是以_int_的_子型別_形式實作。
也就是說,True在_數值上等於_1,而False在_數值上等於_0。
使用_相等運算子_比較它們時,就可以觀察到這點:
>>> 1 == True
True
>>> 0 == False
True
不過,bools和ints仍然不同,用_身分運算子_is比較它們時就能看出這點:
>>> 1 is True
False
>>> 0 is False
False
注意:在 python >= 3.8 中,把字面值(例如
1、''、[]或{})放在is的_左側_會發出警告。
使用相等運算子把布林變數拿來和True或False比較,被視為一種 Python 反模式。
應該改用身分運算子is:
>>> flag = True
# Not "Pythonic"
>>> if flag == True:
... print("This works, but it's not considered Pythonic.")
# A better way
>>> if flag:
... print("Pythonistas prefer this pattern as more Pythonic.")