2013-11-04 144 views
5

我是Python的新手,並嘗試Python邏輯語句。我遇到了這個我無法理解的。可以告訴我在Python 2.7中發生了什麼。有什麼區別0和Python中的錯誤值。布爾Python值混淆

 
>>> 0 or False 
False 
>>> False or 0 
0 

爲什麼口譯員給出了不同的答案?

+0

請注意,這兩個值都是「虛假」;也就是說,他們都在if語句中評估爲「False」。 –

回答

6

您對or運算符的行爲感到困惑;它返回第一個表達式,只有它是一個true值;既不0也不False爲真,從而返回第二個值:

>>> 0 or 'bar' 
'bar' 
>>> False or 'foo' 
'foo' 

任何值不是數值0,一個空的容器,NoneFalse被認爲是真實的(自定義類可以通過實現__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

「它返回第一個表達式爲真」 此處爲0或爲假 錯誤如何爲真? –

+0

我不喜歡這個答案,因爲「它返回第一個表達式爲真」的理由不能完全解釋行爲。類似於「它通過操作數並返回第一個表達式是True或最後一個操作數遇到的」,而不那麼優雅,會更好地解釋遇到的行爲。 –

+0

@WaleedKhan:調整了措辭。 –

1

此行爲的性質以python的順序expression evaluation。 Python從左向右評估表達式,它在lazy manner中執行。這意味着,一個解釋器達到了這一點,當表達式的值爲True時,無論表達式的其餘部分如何,它都將遵循與表達式相關的工作流分支。如果沒有一個表達式是True,它將簡單地返回最近的(最後一個)。這提供了節省計算資源的好處。請看下面的代碼:

>>>False or False or True or range(10**8) 
True 
>>> 

注意,即range(10**8)是從來沒有在這種情況下調用,因此,大量的時間被保存。