1. 程式人生 > >Python中運算子"=="和"is"的差別分析

Python中運算子"=="和"is"的差別分析

Python有兩個用於相等比較的運算子,“is”和“==”(等於)。在這篇文章中,我將帶你們瞭解Python中“is”和“==”的區別,並通過幾個簡單地例子說明應該在什麼時候使用它們,我們先來看一個情景:

當我還是一個孩子的時候,我們的鄰居家有兩隻雙胞胎貓。

這兩隻貓看起來看起來完全一樣 - 同樣的木炭毛,同樣敏銳的綠眼睛。撇開一些個性怪癖,單從它們的外表根本無法區分它們。但他們確確實實是兩隻不同的貓,兩個不同的生物,儘管它們看起來完全一樣。

就如相等和相同在意思上是有差異的,理解這種差異對理解Python中的操作符“is”和“==”是很重要的。

“==”更側重於檢測相等:如果這些貓是Python物件,我們用“==”比較它們,我們會得到“兩隻貓是相等的”。

“is”側重於比較相同:如果我們用“is”比較它們,我們會得到“這是兩隻不同的貓”。

在我把所有的東西都用貓作為類比之前,讓我們來看看一些真正的Python程式碼。

首先,我們將建立一個新的列表物件並將其命名為a,然後定義另一個變數b指向同一列表的物件:

SHAPE \* MERGEFORMAT

我們來看看這兩個變數,我們可以看到它們指向相同的列表。

SHAPE \* MERGEFORMAT

因為兩個列表物件看起來相同,所以當我們使用“==”運算子比較它們的相等性時,我們會得到預期的結果:

SHAPE \* MERGEFORMAT

然而,這並沒有告訴我們a和b是否真的指向同一個物件。當然,我們知道它們是指向同一個物件的,因為我們之前給它們分配了相同的物件,但是假設我們不知道我們會發現什麼?

那麼將兩個變數用“is”操作符進行比較,這會證明兩個變數是指向同一個列表物件的:

SHAPE \* MERGEFORMAT

我們來看看當我們建立列表物件的相同副本時會發生什麼,我們可以通過在現有列表上呼叫list()來建立一個名為c的副本:

SHAPE \* MERGEFORMAT

您將再次看到我們剛剛建立的新列表看起來與a和b指向的list物件相同:

SHAPE \* MERGEFORMAT

這就是有趣的地方,如果我們使用“==”運算子來比較列表副本c和初始化列表a,您希望看到什麼答案?

SHAPE \* MERGEFORMAT

好吧,我希望這是您所期待的,這個結果告訴我們c和a有相同的內容,它們被Python認為是相等的,但它們是否指向同一個物件?我們來看看is操作符:

SHAPE \* MERGEFORMAT

以上我們得到了不同的結果。Python告訴我們,c和a指向兩個不同的物件,儘管它們的內容是相同的。

所以,回顧一下,我們區分“is”和“==”用以下兩個簡短的定義:

如果兩個變數指向同一個(相同的)物件,則“is”表示式為True。

如果變數所引用的物件是相等的(有相同的內容),則“==”表示式的值為True。

只要記住這個,當您需要在Python中使用is和==的時候,就會想到一對孿生的貓(狗也一樣),您就會知道該用哪個了。