<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python中"等于"到底用 == 還是 is ?

          共 1938字,需瀏覽 4分鐘

           ·

          2021-01-23 08:18


          前言

          大家好,我是 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ò)的話,記得分享朋友圈讓更多的人知道!

          神秘禮包獲取方式

          識別文末二維碼,回復(fù):1024

          瀏覽 68
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91乱伦电影 | 色女孩国产视频 | 亚洲图欧美色图另类色妞在线 | 日韩 中文字幕 无码 | 视频在线三区 |