Python面試之 is 和 的區別

2021-10-09 08:56:02 字數 2624 閱讀 5678

​億貝軟體工程(上海)**** 全棧工程師

​關注他契卡

在讀笛卡爾的孟德

等 1,210 人贊同了該文章

面試實習生的時候,當問到 is 和 == 的區別時,很多同學都答不上來,搞不清兩者什麼時候返回一致,什麼時候返回不一致。本文我們來看一下這兩者的區別。

我們先來看幾個例子:

a = "hello"

b = "hello"

print(a is b) # 輸出 true

print(a == b) # 輸出 true

a = "hello world"

b = "hello world"

print(a is b) # 輸出 false

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 值不同。(這段解釋有誤,非常感謝 

@冒泡

同學指正。 

@冒泡

同學指出:intern機制和字串長短無關,在互動模式下,每行字串字面量都會申請乙個新字串,但是只含大小寫字母、數字和下劃線的會被intern,也就是維護了一張dict來使得這些字串全域性唯一)

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

看到這裡,大家是不是搞懂了 is 和 == 的區別呢?

那我們深入一步來思考一下下面這個問題:

python裡和none比較時,為什麼是 is none 而不是 == none 呢?

Python之is 和 的區別

變數 id 在記憶體中儲存的位置 id a value type 變數的資料型別 type a value,type is 三個都判斷 只判斷value和type,不判斷id a is b true,a b一定相等,返回true a b true,a is b 不一定 pydev console s...

Python之is和 的區別

比較的是兩個物件的value值的異同,只要值相同則返回true,並不關心是否是同乙個物件 id是否相同 is則直接比較物件,如果是同乙個物件 即物件的id相同 則返回true id 在記憶體中儲存的位置 type 變數的型別 value 變數的值 比較 type value is比較 type va...

Python之is和 的區別

1 python中物件的三個基本要素,分別是 id 身份標識 type 資料型別 和value 值 2 is和 都是對物件進行比較判斷作用的,但對物件比較判斷的內容並不相同。3 用來比較判斷兩個物件的value 值 是否相等 type和value is也被叫做同一性運算子,會判斷id是否相同 id,...