回答
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. CircleCI沒有測試
- 3. Python單元測試沒有運行
- 4. 沒有sql連接的Python測試
- 5. `python -m unittest discover`沒有發現測試
- 6. Sonar中的Python測試/測試覆蓋率沒有顯示?
- 7. 沒有測試參數化JUnit4測試
- 8. mvn測試沒有找到junit測試
- 9. 沒有測試在餘燼測試
- 10. MVN沒有找到測試
- 11. JMeter測試沒有運行
- 12. NUnit測試沒有執行
- 13. gmaven沒有測試發現
- 14. TestNG沒有運行測試
- 15. 我想沒有硒測試
- 16. Codeception:沒有測試執行
- 17. AndroidJUnit4測試沒有發現
- 18. 測試JSON沒有工作
- 19. NUnit:TestClass沒有任何測試
- 20. 沒有斷點的測試
- 21. Netbeans「沒有執行測試」
- 22. 測試沒有通過,但
- 23. GWTTestCase - 沒有測試發現
- 24. 摩卡沒有運行測試目錄中的所有測試
- 25. 有沒有辦法從終端測試星號,沒有電話
- 26. 有沒有辦法測試變量「isForEachable」
- 27. silverlight3 ui測試有沒有工具?
- 28. 測試有沒有先寫入TDD?
- 29. 有沒有像expect_no_warnings()那樣的測試?
- 30. 有沒有Instagram的測試賬戶
此外,「不是」具有爲此目的而創建的特殊的關係(這不是表達式構造的邏輯後果;「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