Python中"等于"到底用 == 還是 is ?
前言
大家好,我是 kuls。
新年第一篇技術(shù)原創(chuàng)。
最近有讀者問我一道面試題,希望我能夠詳細(xì)的寫一寫相關(guān)的內(nèi)容,這不,馬上安排!
is 和 == 的區(qū)別
看上去其實(shí)很簡單,但是其中也有很多的細(xì)節(jié),今天這篇文章就是帶著大家來深入了解相關(guān)的知識。
舉幾個(gè)例子
如果一開始就解釋,那么肯定很多小伙伴不會(huì)理解,所以我們先跑幾個(gè)程序。
>>>?x?=?y?=?[4,3,1]
>>>?z?=?[4,3,1]
>>>?print(x?is?y)
True
>>>?print(x?==?y)
True
>>>?print(x?==?z)
True
>>>?print(x?is?z)
False
首先我們來看看這個(gè)例子,我們會(huì)發(fā)現(xiàn)x不管是使用 is 還是 == 都返回True,但是x,z的內(nèi)容一樣,使用 == 返回的True,但是使用 is 時(shí)候返回卻是False。
在Python中,== 比較的是值,is 比較的是對象。
其中Python對象中主要包含id、值以及數(shù)據(jù)類型,在is的比較中比較的是id。
所以這里我們再打印一下x、y、z三者的id值
>>>?print(id(x))
140513337973408
>>>?print(id(y))
140513337973408
>>>?print(id(z))
140513337973248
通過比較x與y的id值是相等的,但是z的id值就不同了。
為什么x與y是相同的呢?
在Python中,= 不僅僅只是賦值,它還會(huì)將引用地址也賦過去,所以在內(nèi)存中,x和y調(diào)用的是同一個(gè)對象。
大家可以參照下圖

我們接下來繼續(xù)看
>>>?a?=?'123'
>>>?b?=?'123'
>>>?print(a?is?b)
True
>>>?print(a?==?b)
True
##############
>>>?c?=?100
>>>?d?=?100
>>>?print(c?==?d)
True
>>>?print(c?is?d)
True
##############
>>>?a?=?1000
>>>?b?=?1000
>>>?print(a?is?b)
False
>>>?print(a==b)
True
看到這里可能有些朋友就迷惑了,這...是啥?
首先我來說下字符串為什么會(huì)相等,其實(shí)在python中存在一個(gè)intern機(jī)制,這個(gè)機(jī)制中值同樣的字符串對象僅僅會(huì)保存一份,這樣做是為了提高Python的運(yùn)行效率。
那么它是怎么實(shí)現(xiàn)的呢?其實(shí)很簡單,這個(gè)intern機(jī)制就是通過維護(hù)字符串儲(chǔ)蓄池(一個(gè)字典)來運(yùn)作的,這個(gè)字典的key是字符串的值,value則是這個(gè)字符串的引用地址。
每次當(dāng)你創(chuàng)建一個(gè)新的字符串時(shí),都會(huì)去該字符串儲(chǔ)蓄池查找,是否有相同的字符串值,如果存在則直接調(diào)用該字符串的引用地址。
相信你看到這,已經(jīng)明白字符串為什么會(huì)一直相等了。

接下來我們繼續(xù)聊聊下面兩個(gè)整型的比較,這個(gè)更讓我們迷惑了。
>>>?c?=?100
>>>?d?=?100
>>>?print(c?==?d)
True
>>>?print(c?is?d)
True
##############
>>>?a?=?1000
>>>?b?=?1000
>>>?print(a?is?b)
False
>>>?print(a==b)
True
其實(shí)也并不難理解,在python中有小整數(shù)對象池的概念,小整數(shù)對象池簡單來說就是在[-5,256]這個(gè)區(qū)間內(nèi)創(chuàng)建的對象,不會(huì)被回收。
也就是說,當(dāng)你創(chuàng)建了一個(gè)整數(shù)在[-5,256]這個(gè)區(qū)間內(nèi)時(shí),它會(huì)先去查看是否有相同的值,如果有則直接引用該地址。
如果你創(chuàng)建的不是在這個(gè)區(qū)間內(nèi),那么它會(huì)重新創(chuàng)建一個(gè)新的對象,所以它的地址肯定也就不同了。
總結(jié):在Python中,只有小整數(shù)對象池中和字符串會(huì)調(diào)用已經(jīng)存在的地址,其他的像list,tuple,dict都會(huì)重新創(chuàng)建一個(gè)新的對象。
總結(jié)
在Python中,is 和 == 還是有一些區(qū)別的,我們不能隨意的去使用它。
但是現(xiàn)在我們編寫代碼基本都是在IDE上,例如pycharm,在pycharm中它對解釋器進(jìn)行了優(yōu)化,不管你的值是否在區(qū)間[-5,256]中,只要值相等那么他們兩就會(huì)完全相等。所以這里需要特別注意。
PS:公號內(nèi)回復(fù)「Python」即可進(jìn)入Python 新手學(xué)習(xí)交流群,一起?100 天計(jì)劃!
老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點(diǎn)一下,如果感覺文章內(nèi)容不錯(cuò)的話,記得分享朋友圈讓更多的人知道!


【神秘禮包獲取方式】
