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
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
表達x or y
計算結果爲x
如果x
爲真,或者如果y
x
是假的。
請注意,上述句子中的「真」和「假」是指「真實性」,而不是固定值True
和False
。某些「真實的」使得if
聲明成功;某些「錯誤」會導致失敗。 「假」值包括False
,None
,0
和[]
(空列表)。
LOL,最近創造的術語[真實性](http://en.wikipedia.org/wiki/Truthiness)的創造性應用,但在這裏相當合適,儘管有可疑的起源。 – martineau 2010-10-12 14:14:06
@martineau:從技術意義上講,這是一個更古老的術語。科爾伯特比程序員擁有更好的主流化的機會,但他不是唯一的來源。 – 2010-10-13 21:19:46
是的,顯然是一個*很*舊的術語。在維基詞典中,它們表示「1824年首次證明」。我從來沒有見過使用過@RichieHindle所做的技術感覺 - 儘管在這種情況下它非常有意義。 – martineau 2010-10-13 22:17:36
從布爾的角度來看,它們都表現相同,都返回一個值爲false的值。
or
只是「重用」它給出的值,如果是真的,則返回左邊的值,否則返回正確的值。
Condition1 or Condition2
如果Condition1爲False,則評估並返回Condition2。 無評論爲虛假。
的「或」運算符返回其第一操作數的值,如果該值是在Python化布爾感真(又名其「感實性」),否則返回值的第二操作數的,無論它發生在。請參閱標題爲Boolean operations的小節表達式中的current online documentation。
在這兩個示例中,第一個操作數都被視爲false,所以第二個操作數的值將成爲評估表達式的結果。
一個密切相關的主題:Python的or
和and
short-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
嚴格來說,Python不會將'or'和'and'操作短路,因爲它不會被迫評估爲True或False,而是會返回參數,以便用戶可以應用對象的真實性。 在這個意義上,由RichieHindie答案很明確:對,或者返回的第一個參數,如果計算結果爲真,否則返回第二;因爲,它是轉換,如果第一次評估爲真,則返回第二個,否則返回第一個。 – 2017-10-06 16:57:57
你必須認識到,None
,False
和True
都是單身。
例如,if foo is not None
表示foo
的值不是None
。這與僅有if foo
相同,其基本上是if foo == True
。
因此,not None
和True
的工作方式相同。另外,None
和False
也以相同的方式工作。
>>> 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
,但True
和False
需要==
。避免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
基本上是1
和False
基本上是0
。在Python的舊時代,我們只有1
爲true值,我們有0
爲假值。說True
而不是1
更容易理解和更友好,並且更易於理解和友好地說False
而不是0
。
「如果foo不是None,只要做'if foo':請注意'if foo'與檢查'None'不是一回事! 'if'語句首先將其表達式轉換爲'bool',所以如果'foo == 0','if foo'將會失敗。 – Norrius 2017-12-08 19:36:10
無或False或0與邏輯節點相同。編碼時只需堅持相同的邏輯。如果你給一個變量的起始值爲None,那麼稍後在源代碼中用「if foo is None」來檢查這個值,但這與檢查「if not foo」基本相同。這是多才多藝的,所以使用任何你覺得最好的。 – 2017-12-08 20:45:19
我只是指出這個「基本相同」可能是一個微妙的錯誤的來源。假設你有'def fun(foo:str = None):if foo:bar'。現在,當有人傳入空串時會發生什麼?如果在邏輯中空字符串與None不同,它可能不是理想的結果。 – Norrius 2017-12-08 21:16:49
http://stackoverflow.com/questions/2017230/why-arent-and-and-or-operators-in-python和其他許多人。 – 2010-10-12 15:01:43
Python中[「布爾」運算的可能重複(即:和/或運算符)](http://stackoverflow.com/questions/3826473/boolean-operations-in-python-ie-the-and-or-運營商) – 2010-10-12 15:02:47
@SilentGhost:如果沒有被認爲是假的一樣,爲什麼它返回None,而不是假?應用於兩個虛假值的OR不應該返回False嗎? – yoshi 2010-10-12 18:59:21