經常在**中發現有時候用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版本庫里新增的時候,是分兩步執行的 第...