2010-10-12 139 views
36
In [20]: print None or False 
-------> print(None or False) 
False 

In [21]: print False or None 
-------> print(False or None) 
None 

此行爲令我困惑。有人可以向我解釋爲什麼會發生這種情況?我希望他們都表現一樣。False or None vs. None或False

+2

http://stackoverflow.com/questions/2017230/why-arent-and-and-or-operators-in-python和其他許多人。 – 2010-10-12 15:01:43

+2

Python中[「布爾」運算的可能重複(即:和/或運算符)](http://stackoverflow.com/questions/3826473/boolean-operations-in-python-ie-the-and-or-運營商) – 2010-10-12 15:02:47

+0

@SilentGhost:如果沒有被認爲是假的一樣,爲什麼它返回None,而不是假?應用於兩個虛假值的OR不應該返回False嗎? – yoshi 2010-10-12 18:59:21

回答

54

表達x or y計算結果爲x如果x爲真,或者如果yx是假的。

請注意,上述句子中的「真」和「假」是指「真實性」,而不是固定值TrueFalse。某些「真實的」使得if聲明成功;某些「錯誤」會導致失敗。 「假」值包括False,None,0[](空列表)。

+4

LOL,最近創造的術語[真實性](http://en.wikipedia.org/wiki/Truthiness)的創造性應用,但在這裏相當合適,儘管有可疑的起源。 – martineau 2010-10-12 14:14:06

+2

@martineau:從技術意義上講,這是一個更古老的術語。科爾伯特比程序員擁有更好的主流化的機會,但他不是唯一的來源。 – 2010-10-13 21:19:46

+2

是的,顯然是一個*很*舊的術語。在維基詞典中,它們表示「1824年首次證明」。我從來沒有見過使用過@RichieHindle所做的技術感覺 - 儘管在這種情況下它非常有意義。 – martineau 2010-10-13 22:17:36

0

從布爾的角度來看,它們都表現相同,都返回一個值爲false的值。

or只是「重用」它給出的值,如果是真的,則返回左邊的值,否則返回正確的值。

0
Condition1 or Condition2 

如果Condition1爲False,則評估並返回Condition2。 無評論爲虛假。

8

的「或」運算符返回其第一操作數的,如果該值是在Python化布爾感真(又名其「感實性」),否則返回值的第二操作數的無論它發生在。請參閱標題爲Boolean operations的小節表達式中的current online documentation

在這兩個示例中,第一個操作數都被視爲false,所以第二個操作數的值將成爲評估表達式的結果。

4

一個密切相關的主題:Python的orandshort-circuit。在邏輯or操作中,如果任何參數爲真,那麼整個事情將是真實的,並且不需要評估其他任何東西; Python迅速返回「true」值。如果結束並且沒有結果,則返回它處理的最後一個參數,這將是一個「假」值。

and是相反的,如果它看到任何錯誤的值,它會立即以該「錯誤」值退出,或者如果它通過它,返回最終的「真實」值。

>>> 1 or 2 # first value TRUE, second value doesn't matter 
1 
>>> 1 and 2 # first value TRUE, second value might matter 
2 
>>> 0 or 0.0 # first value FALSE, second value might matter 
0.0 
>>> 0 and 0.0 # first value FALSE, second value doesn't matter 
0 
+0

嚴格來說,Python不會將'or'和'and'操作短路,因爲它不會被迫評估爲True或False,而是會返回參數,以便用戶可以應用對象的真實性。 在這個意義上,由RichieHindie答案很明確:對,或者返回的第一個參數,如果計算結果爲真,否則返回第二;因爲,它是轉換,如果第一次評估爲真,則返回第二個,否則返回第一個。 – 2017-10-06 16:57:57

1

你必須認識到,NoneFalseTrue都是單身。

例如,if foo is not None表示foo的值不是None。這與僅有if foo相同,其基本上是if foo == True

因此,not NoneTrue的工作方式相同。另外,NoneFalse也以相同的方式工作。

>>> foo = not None 
>>> bool(foo) 
True 
>>> foo = 5 # Giving an arbitrary value here 
>>> bool(foo) 
True 

>>> foo = None 
>>> bool(foo) 
False 
>>> foo = 5 # Giving an arbitrary value here 
>>> bool(foo) 
True 

重要的是要認識和了解編碼時是比較兩件事情的時候,None需要is,但TrueFalse需要==。避免if foo == None並且只做if foo is None並且避免if foo != None並且只做if foo is not None。在if foo is not None的情況下,只需做if foo即可。在if foo is None的情況下,簡單地做if not foo

注意:True基本上是1False基本上是0。在Python的舊時代,我們只有1爲true值,我們有0爲假值。說True而不是1更容易理解和更友好,並且更易於理解和友好地說False而不是0

+0

「如果foo不是None,只要做'if foo':請注意'if foo'與檢查'None'不是一回事! 'if'語句首先將其表達式轉換爲'bool',所以如果'foo == 0','if foo'將會失敗。 – Norrius 2017-12-08 19:36:10

+0

無或False或0與邏輯節點相同。編碼時只需堅持相同的邏輯。如果你給一個變量的起始值爲None,那麼稍後在源代碼中用「if foo is None」來檢查這個值,但這與檢查「if not foo」基本相同。這是多才多藝的,所以使用任何你覺得最好的。 – 2017-12-08 20:45:19

+0

我只是指出這個「基本相同」可能是一個微妙的錯誤的來源。假設你有'def fun(foo:str = None):if foo:bar'。現在,當有人傳入空串時會發生什麼?如果在邏輯中空字符串與None不同,它可能不是理想的結果。 – Norrius 2017-12-08 21:16:49

相關問題