3 回答
TA貢獻1876條經驗 獲得超6個贊
if val is not None:
# ...
是用于測試未將變量設置為的Python慣用法None。在用默認參數聲明關鍵字函數的情況下,該慣用法有特殊用途。is在Python中測試身份。因為None正在運行的Python腳本/程序中只有一個實例,所以這是is最佳測試。正如Johnsyweb指出的那樣,這在PEP 8中的 “編程建議”中進行了討論。
至于為什么這是首選
if not (val is None):
# ...
這只是Python Zen的一部分:“可讀性很重要”。好的Python通常接近好的偽代碼。
TA貢獻1876條經驗 獲得超7個贊
來自PEP 8編程建議:
與單例(如None)的比較應始終使用“是”或“不是”進行,永遠不要使用相等運算符進行。
另外,當您真正的意思是“如果x不是None”時,要當心寫“ if x”-例如,在測試是否將默認為None的變量或參數設置為其他值時。另一個值可能具有在布爾上下文中可能為false的類型(例如容器)!
對于任何Python程序員來說,PEP 8都是必不可少的書籍。
TA貢獻1946條經驗 獲得超3個贊
這些問題的最佳選擇是確切地了解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
請注意,最后兩種情況簡化為相同的操作順序(python讀取not (val is None)并使用該is not運算符)。!=與無比較時,第一個使用運算符。
正如其他答案所指出的那樣,!=在與“無”進行比較時使用“
添加回答
舉報
