Python | Python 的 is 和 == 你了解么?
微信公眾號:一個優秀的廢人
如有問題或建議,請后臺留言,我會盡力解決你的問題。

前言
我是狗哥,一名程序猿。做過 Android、擼過 Java、目前在自學 Python 。注冊 「一個優秀的廢人」這個公號已有些日子,真正有心將它運營起來是這兩天萌生的想法。注冊這個號的初衷是分享我的 Python 學習筆記。一個知識,你自己懂,不算是真的懂,你能把他人說懂,才是真正掌握。分享,是一個最好的復習過程。
Python 是一門面向對象的語言,Python中一切皆對象。
Python 中對象包含的三個基本要素,分別是:
1. id(身份標識)
2. type(數據類型)
3. value(值)
其中 id 也代表著內存地址,Python 對象之間比較是否相等既可以用 == ,也可以用 is ,那么二者的區別在哪呢?
既然說到 id 也代表內存地址,那其實 is 比較的就是對象的內存地址,如果兩個對象的 id 相等,則說明這兩個對象指向的是同一個內存地址,是同一實例對象。而 == 就是比較兩個對象的值是否相等,當然,前期是這二者的數據類型一致,否則根本無可比性。另外,== 比較對象通常會調用 Python 的 _ eq _ 方法。
先上一波代碼來解釋一下。
# partA
>>> j = [6,6,6,6,6,6]
>>> b = j
>>> print(b == j)
True
>>> print(b is j)
True
# partB
>>> j = [6,6,6,6,6,6]
>>> b = [6,6,6,6,6,6]
>>> print(b == a)
True
>>> print(b is a)
False
留意代碼你可能有疑問,為毛同樣是 list 類型,值一樣是 [6,6,6,6,6,6] ,partA 和 partB 的結果不一樣呢?
原因是 partA 中,代碼 b = j ,意指把 j 賦值給 b,其實底層做得就是將 b 指向 j 的內存地址。而此時二者 id 相等,值相等。而 partB 中,雖然二者的值都是一樣的,但是此時 b 并不是指向 j ,而是在內存中重新開辟新空間存儲 [6,6,6,6,6,6]。所以 二者的 id 不等,值相等。
不信?你看
# partA
>>> j = [6,6,6,6,6,6]
>>> b = j
>>> print(b == j)
True
>>> print(b is j)
True
>>> print(id(j))
1664043697800
>>> print(id(b))
1664043697800
#partB
>>> j = [6,6,6,6,6,6]
>>> b = [6,6,6,6,6,6]
>>> print(b == a)
True
>>> print(b is a)
False
>>> print(id(j))
1664043698376
>>> print(id(b))
1664043697864
這下該信了吧?
一種特殊情況,先看代碼:
# partA
>>> x = 256
>>> y = 256
>>> print(x == y)
True
>>> print(x is y)
True
# partB
>>> x = 1000
>>> y = 1000
>>> print(x == y)
True
>>> print(x is y)
False
我估計又有朋友要驚了個呆了。為毛 x,y 都等于 256 時,is 和 == 的結果是一樣的,而 x,y 都等于 1000 時,is 就叛變了呢?
其實這要說到 Python 的優化了。Python 為了性能做了許多優化。而其中就包括對較小的,常用的整數對象的優化,Python 底層有一個名叫 small_ints 的鏈表。這個鏈表存儲了 Pyhton 最常用的一些小整數,而這些整數的范圍就在 [-5 , 256] 之間。每當 程序需要用到這個范圍內的整數, Python 就直接到底層鏈表去取,而不需要重新創建一個整數對象。
比較字符串
# partA
>>> n = 'nasus666'
>>> m = 'nasus666'
>>> print(m == n)
True
>>> print(m is n)
True
# partB
>>> m = 'nasus.666'
>>> n = 'nasus.666'
>>> print(m == n)
True
>>> print(m is n)
False
字符串類型不完全相同,這個結果應該和解釋器實現有關。(此處具體原因不明覺厲,請知道的朋友后臺留言,萬分感謝)
各數據類型的比較結果
# 元組
>>> x = (6,6,6)
>>> y = (6,6,6)
>>> print(x is y)
False
>>> print(x == y)
True
# list
>>> x = [6,6,6]
>>> y = [6,6,6]
>>> print(x is y)
False
>>> print(x == y)
True
# dict
>>> x = {'狗哥':'很有錢', '家產':'過億'}
>>> y = {'狗哥':'很有錢', '家產':'過億'}
>>> print(x == y)
True
>>> print(x is y)
False
# set
>>> x = ([6,6,6,6,6])
>>> y = ([6,6,6,6,6])
>>> print(x == y)
True
>>> print(x is y)
False
當對象為數字,字符串,list,dict,set時,is 和 == 的結果都不同。所以不能隨便交換 is 和 == 去比較對象。is 比較的是對像的內存地址,id 值。而 == 更多的是比較對象的值。
總結
- is 比較兩個對象的 id 值是否相等,是否指向同一個內存地址;
- == 比較的是兩個對象的內容是否相等,值是否相等;
- 小整數對象 [-5,256] 在全局解釋器范圍內被放入緩存供重復使用;
- is 運算符比 == 效率高,在變量和 None 進行比較時,應該使用 is。
后語
我不是大神,不是什么牛人,于 Python 領域來說,我是菜雞,但誰剛開始接觸一個領域的時候不是菜雞呢。 寫這個號的目的是為了記錄我自學 Python 的筆記。
如果本文對你哪怕有一丁點幫助請右下角點贊,否則忽略就好。平時工作較忙,自學 Python 的時間較少,可能會學得慢點,希望大家多多指教。
我一直認為學習不能有所見即所得的想法,咋一看可能很簡單,但當你上手操作可能會出現這樣那樣的問題,千萬不要偷懶,所謂大神都是一個一個坑踩過來的。
實踐是檢驗真理的唯一標準,代碼是帶著思考敲出來的,不是看出來的,希望你們多點實踐。
最后,如果對 Python 、Java 感興趣請長按二維碼關注一波,我會努力帶給你們價值,贊賞就不必了,能力沒到,受之有愧。

智能推薦
一文掌握 Python 中的 "is" 和 "=="
本文同步發表于 Prodesire 公眾號和 Prodesire 博客。 引言 Python 的 "is" 和 "==" 想必大家都不陌生,我們在比較變量和字面量時常常用到它們,可是它們的區別在哪里?什么情況下該用 is?什么情況下該用 ==?這成了不少人心中的困惑。 當我們判斷一個變量是否為 None 時,通常會用 is: 而當我們判斷一個變量是否為字面量...
Python3中is和==的區別?
Python3中is和==的區別? 1. 背景: (1)變量、內存理解 變量:用來標識(identify)一塊內存區域。為了方便表示內存,我們操作變量實質上是在操作變量指向的那塊內存單元。編譯器負責分配。我們可以使用Python內建函數id()來獲取變量的地址。 變量名:是一個標識符(dientify),用來代之一塊內存空間,使用這個變量名,我們可以很方便的操作這塊內存區域。 內存:內存是我們電腦...
Python中==和is的區別,以及小數據池
以下是最近學習Python時做的一道題,讓我不禁開始深深的思考... a = '123' b = '123' a與b定義如下,下列哪個是正確的? A、a != b B、a is b C、a == 123 D、a + b = 246 答案是:B 想要完全理解這道題,我們需要知道以下幾點知識...
python is與==的區別
is與==的區別 is 用于判斷兩個變量引用對象是否為同一個, == 用于判斷引用變量的值是否相等。 Python中的對象包含三要素:id、type、value。 其中id用來唯一標示一個對象,type標識對象的類型,value是對象的值。 is判斷的是a對象是否就是b對象,是通過id來判斷的。 ==是通過a對象與b對象的value來判斷的。...
python2與python3的區別&==和is的區別
一. python2 與 python3的區別 簡介: 幾乎所有的python2程序都需要一些修改才能正常的運行在python3的環境下。為了簡化這個轉換過程,Python3自帶了一個2to3的實用腳本.這個腳本會將python2程序源文件作為輸入,然后自動轉換到python3.但并不是所有內容都可以自動轉換。 python2中print是一個語句,不論想輸出什么,直接放到print關鍵字后面即可...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...