Python學習筆記 is 和 的區別

2021-08-18 03:24:14 字數 2209 閱讀 6764

經常在**中發現有時候用is,而有時候用==,弄不清楚兩者到底有何區別,今天閒下來弄清楚

首先讓我們來看下面的幾個例子:

a = "hello"

b = "hello"

print(a is b) #輸出true

print(a==b) #輸出true

a = "hello world"

b = "hello world"

print(a is b) #輸出flase

print(a==b) #輸出true

a = [1, 2, 3]

b = [1, 2, 3]

print(a is b) #輸出false

print(a==b) #輸出true

a = [1, 2, 3]

b = a

print(a is b) #輸出true

print(a==b) #輸出true

上面的輸出結果,為什麼有時 is 和 == 輸出結果相同,而有時不同呢?我們來看看官方文件對 is 和 == 的解釋。

官方文件中說 is 表示物件識別符號(object identity),而 == 表示相等(equality)。is 的作用是檢查物件的識別符號是否相等,也就是比較物件在記憶體中的位址是否一樣;而 == 是檢查兩個物件是否相等。

我們在檢查 a is b 的時候,其實相當於檢查 id(a) == id(b)。而檢查 a == b 的時候,實際是呼叫了物件 a 的 __eq()__ 方法,a == b 相當於 a.__eq__(b)。一般情況下,如果 a is b 返回true的話,即 a 和 b 指向同一塊記憶體位址,a == b 也返回true,即 a 和 b 的值也相等。

看明白上面的解釋之後,我們再來看幾個例子:

a = "hello"

b = "hello"

print(id(a)) # 輸出 140506224367496

print(id(b)) # 輸出 140506224367496

print(a is b) # 輸出 true

print(a == b) # 輸出 true

a = "hello world"

b = "hello world"

print(id(a)) # 輸出 140506208811952

print(id(b)) # 輸出 140506208812208

print(a is b) # 輸出 false

print(a == b) # 輸出 true

a = [1, 2, 3]

b = [1, 2, 3]

print(id(a)) # 輸出 140506224299464

print(id(b)) # 輸出 140506224309576

print(a is b) # 輸出 false

print(a == b) # 輸出 true

a = [1, 2, 3]

b = a

print(id(a)) # 輸出 140506224305672

print(id(b)) # 輸出 140506224305672

print(a is b) # 輸出 true

print(a == b) # 輸出 true

列印出 id(a) 和 id(b) 後就很清楚了。只要 a 和 b 的值相等,a == b 就會返回true,而只有 id(a) 和 id(b) 相等時,a is b 才返回 true。

這裡還有乙個問題,為什麼 a 和 b 都是 「hello」 的時候,a is b 返回true,而 a 和 b都是 「hello world」 的時候,a is b 返回false呢?

這是因為前一種情況下python的字串駐留機制起了作用。對於只包含字母、數字、下劃線的字串,為了提高系統效能python會保留其值的乙個副本,當建立新的字串的時候直接指向該副本即可。所以 「hello」 在記憶體中只有乙個副本,a 和 b 的 id 值相同,而 「hello world」 這個字串包含空格字元,不駐留記憶體,python中各自建立了物件來表示 a 和 b,所以他們的值相同但 id 值不同。

總結一下,is 是檢查兩個物件是否指向同一塊記憶體空間,而 == 是檢查他們的值是否相等。可以看出,is 是比 == 更嚴格的檢查,is 返回true表明這兩個物件指向同一塊記憶體,值也一定相同。

python學習筆記之深拷貝和淺拷貝的區別

python深拷貝和淺拷貝的區別 1 在考慮深拷貝和淺拷貝區別之前,我們需要知道python中可變物件和不可變物件 2 淺拷貝和深拷貝區別 淺拷貝 淺拷貝 1 淺拷貝 可變物件 物件中有不可變資料型別 總結 拷貝出來的物件和原有物件位址不是同乙個,但是物件中的一一對應元素位址均相同 如果是對原物件中...

GIT 學習筆記(一) 工作區,暫存區和倉庫

git中用來儲存你每一次更改的版本的目錄。版本庫其實就是git管理檔案的倉庫,通俗點說就是乙個目錄,不過在這個目錄裡面,所有的檔案都在被git管理,包括每個檔案的修改和刪除,都能找到對應的操作記錄,對於新增的檔案,要先新增到版本庫中才能被git管理起來。git管理的檔案分為 工作區,版本庫,版本庫又...

git學習筆記(四)之工作區和暫存區

工作區有乙個隱藏目錄.git,這個不算工作區,而是git的版本庫。git的版本庫里存了很多東西,其中最重要的就是稱為stage 或者叫index 的暫存區,還有git為我們自動建立的第乙個分支master,以及指向master的乙個指標叫head。把檔案往git版本庫里新增的時候,是分兩步執行的 第...