• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 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 感興趣請長按二維碼關注一波,我會努力帶給你們價值,贊賞就不必了,能力沒到,受之有愧。


    一個優秀的廢人

    版權聲明:本文為turodog原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/turodog/article/details/81263950

    智能推薦

    一文掌握 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關鍵字后面即可...

    猜你喜歡

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    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壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    精品国产乱码久久久久久蜜桃不卡