簡體   English   中英

(x不是None)和(y不是None)和(x和y)之間的python區別不是None

[英]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 有時會產生意想不到的結果。 (請咨詢andor的特殊性質

如果要檢查,以確保這兩個 xyNone你應該做類似如下:

>>> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM