我是Python的新手,並嘗試Python邏輯語句。我遇到了這個我無法理解的。可以告訴我在Python 2.7中發生了什麼。有什麼區別0和Python中的錯誤值。布爾Python值混淆
>>> 0 or False False >>> False or 0 0
爲什麼口譯員給出了不同的答案?
我是Python的新手,並嘗試Python邏輯語句。我遇到了這個我無法理解的。可以告訴我在Python 2.7中發生了什麼。有什麼區別0和Python中的錯誤值。布爾Python值混淆
>>> 0 or False False >>> False or 0 0
爲什麼口譯員給出了不同的答案?
您對or
運算符的行爲感到困惑;它返回第一個表達式,只有它是一個true值;既不0
也不False
爲真,從而返回第二個值:
>>> 0 or 'bar'
'bar'
>>> False or 'foo'
'foo'
任何值不是數值0,一個空的容器,None
或False
被認爲是真實的(自定義類可以通過實現__bool__
方法改變該(蟒3),__nonzero__
(蟒2)或__len__
(長度0是空的)
第二表達甚至沒有評估如果第一是True
:
>>> True or 1/0
True
1/0
表達式會引發ZeroDivision
異常,但甚至不會由Python進行評估。
這是記錄在boolean operators documentation:
表達
x or y
首先評估x
;如果x
爲真,則返回其值;否則,將評估y
並返回結果值。
同樣,and
返回第一個表達式,如果它是False
,否則返回第二個表達式。
「它返回第一個表達式爲真」 此處爲0或爲假 錯誤如何爲真? –
我不喜歡這個答案,因爲「它返回第一個表達式爲真」的理由不能完全解釋行爲。類似於「它通過操作數並返回第一個表達式是True或最後一個操作數遇到的」,而不那麼優雅,會更好地解釋遇到的行爲。 –
@WaleedKhan:調整了措辭。 –
此行爲的性質以python的順序expression evaluation
。 Python從左向右評估表達式,它在lazy manner中執行。這意味着,一個解釋器達到了這一點,當表達式的值爲True
時,無論表達式的其餘部分如何,它都將遵循與表達式相關的工作流分支。如果沒有一個表達式是True
,它將簡單地返回最近的(最後一個)。這提供了節省計算資源的好處。請看下面的代碼:
>>>False or False or True or range(10**8)
True
>>>
注意,即range(10**8)
是從來沒有在這種情況下調用,因此,大量的時間被保存。
請注意,這兩個值都是「虛假」;也就是說,他們都在if語句中評估爲「False」。 –