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