a = True print(a and 0 or 99) # ==> 99
a = True print(a and 0 or 99) # ==> 99
得到的計算結果不是布爾類型,而是數字99,這是為什么呢?
因為Python把0、空字符串和None看成False,其他數值和非空字符串都看成True,所以:
True and 0
計算結果是0?
繼續計算0 or 99
計算結果是 99?
因此,結果是99。
需要注意的是,not計算的優先級是高于and和or的。
始終不明所以,求更詳細的解說
2025-02-11
Python布爾運算的規則
在Python中,布爾運算符
and
和or
的邏輯是基于“短路”(short-circuiting)的,這意味著它們會在確定結果后立即停止計算。具體規則如下:and
運算:如果
A
為True
(或者等價于True
的值,如非零數字、非空字符串等),則返回B
的值。A and B
: -如果A
為False
(或者等價于False
的值,如0
、None
、空字符串""
等),則直接返回A
的值。or
運算:如果
A
為True
(或者等價于True
的值),則直接返回A
的值。如果A``為
False
(或者等價于False
的值),則返回B
的值。A or B
:代碼的逐步解析
a and 0
:a
的值是True
。根據
and
的規則,True and 0
會先判斷True
,因為True
為真值,所以返回第二個值0
。因此,
a and 0
的結果是0
。**
0 or 99
: ** ? -0
是一個假值(等價于False
)。根據
or
的規則,0 or 99
會先判斷0
,因為0
為假值,所以返回第二個值99
。因此,
0 or 99
的結果是99
。最終結果
所以,整個表達式
a and 0 or 99
的計算過程是:先計算
a and 0
,結果是0
。再計算
0 or 99
,結果是99
。因此,最終輸出的結果是
99
。關于優先級
你提到的
not
運算符的優先級高于and
和or
,這是正確的。但在你的表達式中并沒有not
運算符,所以優先級問題在這里并不影響結果。總結
Python的布爾運算符
and
和or
是基于短路邏輯的,它們會根據第一個操作數的值決定是否繼續計算。在你的例子中,
a and 0
的結果是0
,而0 or 99
的結果是99
。最終結果是
99
,而不是布爾值True
或False
,因為布爾運算的結果可以是任何值,而不僅僅是布爾類型。