經過上面代碼的比較,我想很容易看得出," is" 是用來比較 a 和 b 是否是指向同一個內存單元,而"=="是用來比較 a 和 b指向的內存單元中的值是否是相等。下面敲黑板,若是你本身的實驗結果和個人不一致,請不要懷疑我,也不要懷疑本身的編譯器,我想你應該遇到了下面的這種狀況:python
上面這張圖和第一張圖沒有什麼區別,只是a 和 b的值由以前的500變成了3,可是結果卻和第一張大不相同,咱們發現is和==在此時都爲true而且a和b的地址徹底相同。尼瑪,活見鬼了,咱們以前的理解是a對應的500和b對應的500應該不在一個內存單元呀!其實這是python解釋器搞得鬼,具體是由於python的垃圾回收機制,這個垃圾回收機制會在以後的文章中詳細介紹,至於出現上面這種現象是由於一個叫小整數對象池的東西,python爲了優化速度,會把【-5,256】之間的數據提早存放在小整數對象池中,程序中只要用的【-5,256】之間的數據不會再從新建立一份,都是指向對象池中的同一份數據,除了這個區間以外的數據,每次使用時系統都會從新申請一塊內存,用來存儲數據,這樣以前的現象也就不奇怪了。 到這裏,「 is 」和 「==」之間的恩怨情仇彷佛介紹的差很少了,咱們接下來再來單獨看看「==」。你是否想過python解釋器在底層是如何處理「==」的,或者說如何判斷兩個對象是否相等的呢? 對於數值類型的數據,只要兩個數據大小相等,那麼就是相等,可是對於非數值型的數據,好比字符串,類建立的對象又是比較什麼呢?答案是python默認去比較兩個對象的地址,有圖有真相: 咱們發現上圖中,p1和p2兩個對象的內容徹底相同,可是python編譯器卻認爲其不相等,這個時候就須要咱們本身去定義規則去規定在什麼條件下兩個對象是相等的,具體操做須要去重寫python中的__eq__方法,一般把這個過程叫作運算符重載。下面這張圖就是完成運算符重載以後的操做,咱們發現這時候兩個對象的值是相等的。 優化
對於「==」和 「is」的介紹到此就結束了,但願能幫到以前對此有過困惑的小夥伴,我先撤了哈。對象