2010-10-19 66 views

回答

632
if val is not None: 
    # ... 

是測試變量未設置爲None的Pythonic成語。這個成語在declaring keyword functions with default parameters的情況下有特殊用途。 is在Python中測試身份。由於在運行的Python腳本/程序中存在None的一個且僅有一個實例,因此is是最佳測試。由於Johnsyweb points out,在「編程建議」下的PEP 8中對此進行了討論。

至於爲什麼這是優選

if not (val is None): 
    # ... 

這簡直是Zen of Python的一部分:「可讀性計數」。良好的Python往往接近良好pseudocode

+38

此外,「不是」具有爲此目的而創建的特殊的關係(這不是表達式構造的邏輯後果;「1是(不是無)」和「1不是無」)有兩個不同的結果 – 2012-03-26 11:03:49

+13

+1:我喜歡這個參考 - 「好Python經常接近好的僞代碼」 – legesh 2012-03-29 08:38:19

+1

「not None」返回True。有趣的。 – Ries 2013-06-14 13:18:11

18

後兩者中的任一個,因爲val可能是一種類型,它定義了__eq__()在傳遞None時返回true。

+4

這是相當卑鄙'__eq __()'的行爲,這是我從來沒有考慮。抓住角落案件的好答案。 – gotgenes 2010-10-19 03:37:18

74

從,編程建議,PEP 8

比較像無單身應始終 做「是」或「不是」,從來沒有平等的運營商。

另外,當你的意思是「如果x不是無」 - 例如測試是否將默認爲 None的變量或參數設置爲某個其他值。另一個值的類型可能是 (如容器),在布爾上下文中可能爲false!

PEP 8對於任何Python程序員來說都是必不可少的讀物。

+4

+1爲「必讀」 - 不知道 – user2314737 2014-09-25 13:09:35

12

這些類型的問題最好的辦法就是看看python究竟做了什麼。該dis模塊是令人難以置信的信息:

>>> def f(val): 
... if val != None: 
...  return True 
... return False 
... 
>>> def g(val): 
... if not (val is None): 
...  return True 
... return False 
... 
>>> def h(val): 
... if val is not None: 
...  return True 
... return False 
... 
>>> import dis 
>>> dis.dis(f) 
    2   0 LOAD_FAST    0 (val) 
       3 LOAD_CONST    0 (None) 
       6 COMPARE_OP    3 (!=) 
       9 POP_JUMP_IF_FALSE  16 

    3   12 LOAD_GLOBAL    1 (True) 
      15 RETURN_VALUE 

    4  >> 16 LOAD_GLOBAL    2 (False) 
      19 RETURN_VALUE 
>>> dis.dis(g) 
    2   0 LOAD_FAST    0 (val) 
       3 LOAD_CONST    0 (None) 
       6 COMPARE_OP    9 (is not) 
       9 POP_JUMP_IF_FALSE  16 

    3   12 LOAD_GLOBAL    1 (True) 
      15 RETURN_VALUE 

    4  >> 16 LOAD_GLOBAL    2 (False) 
      19 RETURN_VALUE 
>>> dis.dis(h) 
    2   0 LOAD_FAST    0 (val) 
       3 LOAD_CONST    0 (None) 
       6 COMPARE_OP    9 (is not) 
       9 POP_JUMP_IF_FALSE  16 

    3   12 LOAD_GLOBAL    1 (True) 
      15 RETURN_VALUE 

    4  >> 16 LOAD_GLOBAL    2 (False) 
      19 RETURN_VALUE 

需要注意的是後兩種情況下減少操作相同的序列(蟒蛇讀取not (val is None)並使用is not運營商)。與None比較時,第一個使用!=運算符。

正如所指出的其他的答案,與無比較時使用!=是一個壞主意

+0

compare_op 9和3有什麼區別? – evolvedmicrobe 2017-01-10 01:01:04