今天讓AI幫我寫代碼,突然發現寫出來一句類似1<a<2
,我頓感疑惑:不是只能用and連接嗎?
一試發現真行,那我辛辛苦苦寫了好幾年的 (條件1) and (條件2) 算什么?算我勤快嗎?😭
常常寫Javascript的有共情一下的嗎?😥
if a也是,原來不需要寫if a==''啊……
if not a也是,竟然支持字符串、列表、字典等多種比較方式呢!
if a is None就更是反我的直覺了,它居然比a==None效率更高!(眾所周知Javascript里面NaN !== NaN
,并且NaN===NaN
是False,這讓我對Python的None也不敢亂用……)
文章目錄
- 鏈式比較
- 具體說明:
- 示例:
- 為什么其他語言不支持?
- 總結:
- 真值測試
- 主要區別:
- 示例:
- 結論:
- a is None
- 關鍵點:
- 示例:
- 常見用途:
- 注意:
鏈式比較
在 Python 中,1 < a < 2
這種鏈式比較(chained comparison)從 Python 最早的版本 就支持了,這是 Python 語言設計的一個特性,而不是后來新增的語法。
具體說明:
- Python 的鏈式比較會被解釋為
(1 < a) and (a < 2)
,但它的計算方式更高效(a
只會被計算一次)。 - 這個特性在 Python 1.0(1994年發布)就已經存在,并一直延續至今。
示例:
a = 1.5
print(1 < a < 2) # True
等價于:
print(1 < a and a < 2) # True
為什么其他語言不支持?
許多其他編程語言(如 C、Java、JavaScript)不支持這種寫法,因為它們會把 1 < a < 2
解析為 (1 < a) < 2
,而 (1 < a)
返回的是布爾值(True
或 False
),再與 2
比較會導致類型不匹配或邏輯錯誤。
總結:
Python 從一開始就支持 1 < a < 2
這種鏈式比較語法,這是 Python 語言的一個特色特性,使得代碼更簡潔易讀。
真值測試
在 Python 中,not struct.dmas
和 len(struct.dmas) == 0
并不完全等效,盡管在某些情況下它們可能產生相同的結果。它們的區別取決于 struct.dmas
的具體實現和類型。
主要區別:
-
not struct.dmas
:- 這是 Python 的“真值測試”(truthiness testing),會調用
__bool__()
或__len__()
方法(如果__bool__
未定義)。 - 如果
struct.dmas
是空列表、空字典、空字符串、None
、False
、數值0
或空容器,not struct.dmas
會返回True
。 - 但如果
struct.dmas
是一個自定義對象,它的__bool__()
或__len__()
方法可能返回非預期值。
- 這是 Python 的“真值測試”(truthiness testing),會調用
-
**
len(struct.dmas) == 0
****:- 這顯式檢查
struct.dmas
的長度是否為0
,要求對象必須實現__len__()
方法。 - 如果
struct.dmas
沒有__len__()
方法(如數值、None
或某些自定義對象),會拋出TypeError
。
- 這顯式檢查
示例:
class CustomObject:def __len__(self):return 0obj = CustomObject()print(not obj) # True(調用 __len__())
print(len(obj) == 0) # True
但如果 struct.dmas
是 None
:
struct.dmas = None
print(not struct.dmas) # True(None 是假值)
print(len(struct.dmas) == 0) # TypeError: object of type 'NoneType' has no len()
結論:
- 如果
struct.dmas
一定是序列/容器(如列表、字符串、字典等),兩者通常等效。 - 如果
struct.dmas
可能是其他類型(如None
、自定義對象等),兩者可能不等效,甚至len()
會報錯。 - 更推薦用
not struct.dmas
,除非你明確需要檢查長度且確保對象是序列。
a is None
在Python中,a is None
是一種檢查變量 a
是否等于 None
的寫法。這里的 is
是Python的身份運算符(identity operator),用于比較兩個對象是否是同一個對象(即內存地址是否相同),而不僅僅是值相等。
關鍵點:
None
是Python中的單例對象,所有None
值在內存中都是同一個對象。is
比較的是對象的身份(內存地址),而==
比較的是值。a is None
比a == None
更推薦,因為:- 更高效(直接比較內存地址)。
- 更符合Python的慣例(PEP 8推薦用
is
或is not
比較None
)。
示例:
a = None
b = None
c = []print(a is None) # True,因為 a 就是 None
print(b is None) # True,因為 b 也是 None
print(c is None) # False,因為 c 是空列表,不是 None# 不推薦的寫法(雖然結果可能相同):
print(a == None) # True,但不建議這樣寫
常見用途:
- 檢查函數默認參數是否被傳遞:
def foo(x=None):if x is None:x = []
- 判斷變量是否未初始化或作為空值占位符。
注意:
- 對于除
None
之外的其他對象(如數字、字符串、列表等),通常用==
比較值,而非is
。例如:x = 1000 print(x is 1000) # 可能為False(因Python小整數優化,結果不確定) print(x == 1000) # True,總是用 == 比較值
總結:a is None
是Python中判斷變量是否為 None
的標準寫法。
本賬號所有文章均為原創,歡迎轉載,請注明文章出處:https://shandianchengzi.blog.csdn.net/article/details/148404731。百度和各類采集站皆不可信,搜索請謹慎鑒別。技術類文章一般都有時效性,本人習慣不定期對自己的博文進行修正和更新,因此請訪問出處以查看本文的最新版本。