2014-11-06 38 views
3

我剛開始使用Python和建議利用isis not我在網上教授的值進行比較True時,才False,或None(或者至少是我明白他在說什麼。)爲什麼要避免使用「是」和「不是」?

現在在我的頭,我把is與JavaScript ===is not和JavaScript "!=="等同起來,我認爲最好的做法是儘量多地使用===!==以避免強制類型轉換。

首先,我們不想在JavaScript中使用isis not多達===!==,如果是這樣,爲什麼不呢?

+9

''''''不''完全不能與Javascript的'==='/'!=='相媲美。 – interjay 2014-11-06 11:44:49

+0

請參閱[本](http://stackoverflow.com/a/2988117/2206044)。 – Azar 2014-11-06 11:45:42

+0

技術上,'is'和'not''和JavaScript中的'==='和'!=='是一樣的。 JavaScript中的'==='和'!=='檢查對象上的身份相等性。它恰好發生在Python中的數字和字符串上,因爲Python中的數字和字符串都是對象,與JavaScript中的數字和字符串不同。 – rightfold 2014-11-06 12:08:25

回答

1

None是一個單,這樣你可以比較反對身份is/is not),而不是平等==/!=) - 每當你訪問None,你得到同一個對象

對於幾乎所有其他情況下,你應該用平等的(見例如Why does comparing strings in Python using either '==' or 'is' sometimes produce a different result?)。在術語「避免[和]強制類型轉換」 - Python是強類型,絕不會隱式轉換。另外,你不能在Python中真正「投射」一種類型 - 例如轉換一個intstr創建一個新的,單獨的對象。如果False0[]或其他任何評估False -y是有效返回,評估「感實性」將會給誤導的結果 -

None通常用來標記師妹這一點尤爲重要。

def yes_or_no(s): 
    """Convert 'yes' or 'no' to boolean, or implicitly return None.""" 
    if s.lower() == "yes": 
     return True 
    elif s.lower() == "no": 
     return False 

result = some_func("foo") 

if result: # wrong, covers None and False 
    ... 

if result is not None: # right, covers None only 
    ... 

the style guide

比較像None單身應始終isis not,從來沒有平等的運營商來完成。

此外,提防寫if x當你真正的意思是,如果x is not None - 例如當測試一個變量或參數默認爲None是否被設置爲某個其他值時。另一個值可能有一個類型(如容器),在布爾上下文中可能爲false!


請注意,您通常比較TrueFalse。再次,從風格指南:

不要布爾值比較TrueFalse使用==來。

Yes: if greeting: 
No: if greeting == True: 
Worse: if greeting is True: 

參見:Use of True, False, and None as return values in python functions

+1

檢查平等會給誤導結果。你確定嗎?你的例子('如果結果')測試平等(vs *真實性*)?否則,很好的概述 – goncalopp 2014-11-06 11:55:52

+0

我覺得'some_func'應該是'yes_or_no' – Elisha 2014-11-06 11:57:14

+0

@goncalopp這是一個很好的觀點,我會嘗試澄清 – jonrsharpe 2014-11-06 11:57:41

2

Python的is==運營商做兩個不同的東西。你也不能比較is和JS的===

簡單地說,==測試兩個標識符是否相等,而is測試兩個標識符是否具有相同的存儲器地址,因此是否「它們是彼此」;他們的行爲方式就像它的聲音:

#0 equals None, so returns True 
0 == None 

#But it isn't None, hence returns False 
0 is None 

#However, 0 is 0, so returns True 
0 is 0 
+0

考慮在Javascript中添加一些示例來說明'==='和'is'運算符'不能比較「,如你所述。迄今爲止給出的所有答案都可以說是不完整的,因爲它們只解釋了問題的Python方面,而沒有說明JS和Python在這種情況下究竟有什麼不同。 – SeldomNeedy 2015-10-16 19:23:48

0

我們不應該使用isis notTrueFalseNone,因爲下面的怪異結果可能相互比較值:

>>> 20 is 19+1 
True 
>>> 19+1 is 20 
True 
>>> 1999+1 is 2000 
False 
>>> -0 is 0 
True 
>>> -0.0 is 0.0 
False 
>>> -0.0 is not 0.0 
True 
>>> 1999+1 is not 2000 
True 
>>> -0.0 == 0.0 
True 
>>> 1999+1 == 2000 
True 
>>> 1999+1 != 2000 
False 
>>> -0.0 != 0.0 
False 
相關問題