回答
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。
後兩者中的任一個,因爲val
可能是一種類型,它定義了__eq__()
在傳遞None
時返回true。
這是相當卑鄙'__eq __()'的行爲,這是我從來沒有考慮。抓住角落案件的好答案。 – gotgenes 2010-10-19 03:37:18
從,編程建議,PEP 8:
比較像無單身應始終 做「是」或「不是」,從來沒有平等的運營商。
另外,當你的意思是「如果x不是無」 - 例如測試是否將默認爲 None的變量或參數設置爲某個其他值。另一個值的類型可能是 (如容器),在布爾上下文中可能爲false!
PEP 8對於任何Python程序員來說都是必不可少的讀物。
+1爲「必讀」 - 不知道 – user2314737 2014-09-25 13:09:35
這些類型的問題最好的辦法就是看看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比較時,第一個使用!=
運算符。
正如所指出的其他的答案,與無比較時使用!=
是一個壞主意
compare_op 9和3有什麼區別? – evolvedmicrobe 2017-01-10 01:01:04
- 1. Python單元測試有沒有像'autotest'?
- 2. `python -m unittest discover`沒有發現測試
- 3. 沒有sql連接的Python測試
- 4. Python單元測試沒有運行
- 5. mvn測試沒有找到junit測試
- 6. 沒有測試參數化JUnit4測試
- 7. 沒有測試在餘燼測試
- 8. Codeception:沒有測試執行
- 9. 測試JSON沒有工作
- 10. gmaven沒有測試發現
- 11. 沒有斷點的測試
- 12. GWTTestCase - 沒有測試發現
- 13. Netbeans「沒有執行測試」
- 14. JMeter測試沒有運行
- 15. 有沒有numpy/scipy的測試套件?
- 16. SpringBoot測試ContextConfiguration有沒有橫幅
- 17. 有沒有辦法測試CSS文件?
- 18. 有沒有這樣的測試工具
- 19. 有沒有辦法測試變量「isForEachable」
- 20. 測試有沒有先寫入TDD?
- 21. Python:'單元測試'有'doctest'沒有的東西嗎?
- 22. 有沒有人試過NetBeans 6.5 Python IDE?
- 23. 在沒有修改的線程中測試Python代碼?
- 24. 如何測試在Python中沒有輸入3.3.0
- 25. OCUnit測試沒有運行/沒有找到
- 26. junit測試用例事務沒有被提交 - 沒有錯誤
- 27. 有沒有在Python
- 28. 在maven中運行單個測試 - >沒有執行測試!
- 29. 有沒有方法可以測試VB6中是否有Function/Sub?
- 30. Visual Studio 2010 - 沒有測試運行,因爲沒有測試加載或選擇的測試被禁用
此外,「不是」具有爲此目的而創建的特殊的關係(這不是表達式構造的邏輯後果;「1是(不是無)」和「1不是無」)有兩個不同的結果 – 2012-03-26 11:03:49
+1:我喜歡這個參考 - 「好Python經常接近好的僞代碼」 – legesh 2012-03-29 08:38:19
「not None」返回True。有趣的。 – Ries 2013-06-14 13:18:11