[英]python difference between (x is not None) and (y is not None) and (x and y) is not None
以下條件給出相同的結果。 兩者之間是否有任何性能差異(或其他差異)?
1。
if (x != None) and (y != None):
# Proceed
2。
if (x and y) is not None:
# Proceed
In [44]: x = False
In [45]: y = None
In [46]: (x != None) and (y != None)
Out[46]: False
In [47]: (x and y) is not None
Out[47]: True
順便說一句,當測試是否為None時,最好進行測試
if x is None
而不是
if x == None
結果可能會有所不同:
class Egalitarian(object):
def __eq__(self, other):
return True
x = Egalitarian()
print(x == None)
# True
print(x is None)
# False
程序員的妻子問他:早餐要吃香腸還是培根? -是的,他回答。
在日常工作中使用布爾構造時,我們傾向於跳過通用部分,以使X(Y) @ X(Z)
變為X @ (Y,Z)
:
Her bunny is happy and her hamster is happy (1)
是相同的
Her bunny and her hamster are happy
但是,在編程中,我們不能像這樣收縮事情。 第一句話
bunny == happy and hamster == happy
如果兩只寵物都很好,那將是正確的。 第二句話直譯為:
(bunny and hamster) == happy
在這里, (bunny and hamster)
計算結果為
- a falsy value, if she's got no bunny
- the hamster otherwise
所以(bunny and hamster) == happy
是:
She's got a bunny and her hamster is happy
與陳述(1)完全不同
在python中:
>>> happy = 1
>>> sad = 2
>>> bunny = sad
>>> hamster = happy
>>> bunny == happy and hamster == happy
False
>>> (bunny and hamster) == happy
True
>>>
您需要了解正在做的事情才能了解真正的差異,您可能會認為以下內容很簡單:
>>> if (x and y) is not None:
這不是一個簡單的條件語句。 在這里,你第一次評估(x and y)
將返回最后Truthy價值發現或找到的第一個Falsey值,然后比較,為is not None
。 有時會產生意想不到的結果。 (請咨詢and
和or
的特殊性質 )
如果要檢查,以確保這兩個 x
和y
不None
你應該做類似如下:
>>> if all(var is not None for var in [x, y]):
幾乎與以下內容相同:
>>> if x is not None and y is not None:
僅一點點就更易於閱讀,並且更健壯(如果要添加更多變量來檢查),
無論哪種方式,您的兩個語句之間的區別在於,第一個語句實際上將按照您的期望進行操作,但是當涉及到None
時,您應該使用is not
不是!=
。 第二條語句有時可能會起作用,但是正在做您可能沒想到的事情。
通常
if x and y:
#Proceed
在Python世界中足夠好。
我在這里說的足夠好,因為在大多數情況下,函數在函數邏輯中具有不同含義時不應返回False和None。
對於那些討厭的人,您會認真地在現實世界中編寫以下代碼嗎?
if x is None:
#xxx
elif x == False:
#xxxx
else:
#xxx
我只想指出,兩個示例都不是pythonic的,應該避免。
“是”和“不是”在檢查身份(即比較指針/引用)時很快
其他比較和邏輯運算符將檢查對象的值(或真實性)。
通常,要檢查“無”值,因此要使用“是” /“不是”。
我個人發現,依靠表達式中None值的行為是錯誤的形式(通常會觸發NullPointerException或許多其他語言的類似錯誤的東西),因此盡管我不確定自己要達到的目標,但通常我寫的類似代碼看起來像:
if x is not None and y is not None:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.