日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳解Python中的==”和“is

“==”和“is”都是 Python 中的運算符。對于初學(xué)者,他們可能會把“ a==b ”解釋為“ a 等于 b ”,“a is b”也可以解釋為“ a是b ”。這可能就是初學(xué)者在 Python 中混淆“ == ”和“ is ”的原因。

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)東至免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了超過千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

可能在網(wǎng)上你經(jīng)常能看到關(guān)于這個問題的答案和解析,但是依然有很多剛開始學(xué)習(xí)Python的人,不了解這個問題,也不知道為什么問這個問題時會暴露自己是“菜鳥”,這個問題就是:

“==” 和 “is”之間有什么區(qū)別?

“==”和“is”都是 Python 中的運算符。對于初學(xué)者,他們可能會把“ a==b ”解釋為“ a 等于 b ”,“a is b”也可以解釋為“ a是b ”。這可能就是初學(xué)者在 Python 中混淆“ == ”和“ is ”的原因。

在開始之前,我想先展示一些使用“==”和“is”的例子。

>>> a = 5
>>> b = 5
>>> a == b
True
>>> a is b
True

很簡單,對吧? a == b 和 a is b 都返回了結(jié)果 True。接下來我們看另一個示例:

>>> a = 1000
>>> b = 1000
>>> a == b
True
>>> a is b
False

WTF ?!? 從第一個示例到第二個示例的唯一變化就是 a 和 b 的值從 5 到 1000。但是返回的結(jié)果在 “ ==” 和 “ is” 已經(jīng)不同。我們再看另一個示例:

>>> a = []
>>> b = []
>>> a == b
True
>>> a is b
False

下面是最后一個例子,看完是不是覺得自己的腦子要爆炸?

>>> a = 1000
>>> b = 1000
>>> a == b
True
>>> a is b
False
>>> a = b  
>>> a == b
True
>>> a is b
True

“ ==”的正式運算是相等,而“ is”的運算是標識。 一般使用“ ==”來比較兩個對象的值。 “ a == b”應(yīng)解釋為“ a的值是否等于b的值”。 在上述所有示例中,a 的值始終等于 b 的值(即使對于空列表示例也是如此)。 因此,“ a == b”始終為真。

在解釋身份之前,我需要先介紹 id 函數(shù)。 我們可以使用 id 函數(shù)獲得對象的標識。 這個身份在整個時間內(nèi)對于此對象都是唯一且恒定的。此標識在整個時間內(nèi)對該對象是唯一且不變的。你可以把它看作是這個對象的地址。如果兩個對象具有相同的標識,則它們的值也必須相同。

>>> id(a)
2047616

運算符“ is ”是比較兩個對象的標識是否相同。“a is b”的意思是“a的身份與b的身份相同”。

如果你知道“ ==”和“ is”的實際含義,我們就可以開始研究上面的幾個示例了。

首先是第一個和第二個示例中的結(jié)果不同。 顯示不同結(jié)果的原因是Python存儲了一個介于-5到256之間的整數(shù)的數(shù)組列表,每個整數(shù)具有固定的標識。當(dāng)我們在此范圍內(nèi)分配整數(shù)變量時,Python會將此變量的標識分配為數(shù)組列表內(nèi)整數(shù)的整數(shù)。 結(jié)果,對于第一個示例,由于a和b的標識都是從數(shù)組列表中獲得的,因此它們的標識當(dāng)然是相同的,因此 “a is b” 為True。

>>> a = 5
>>> id(a)
1450375152
>>> b = 5
>>> id(b)
1450375152

但是一旦該變量的值超出該范圍,由于 Python 內(nèi)部沒有具有該值的對象,因此Python將為此變量創(chuàng)建一個新的標識并將該值分配給該變量。 如前所述,身份對于每個創(chuàng)建都是唯一的,因此,即使兩個變量的值相同,其身份也永遠不會相等。 這就是為什么“a is b”在第二個例子結(jié)果為False。

>>> a = 1000
>>> id(a)
12728608
>>> b = 1000
>>> id(b)
13620208

PS:如果你打開了兩個控制臺,該值仍在該范圍內(nèi),那么你將獲得相同的標識。但是,如果該值不在該范圍內(nèi),則結(jié)果就會發(fā)生改變。

如果你理解了第一示例和第二示例之間的區(qū)別,就很容易理解第三示例的結(jié)果。由于 Python 不存儲“空列表”對象,因此 Python 創(chuàng)建了一個新對象并分配了“空列表”值。無論兩個列表為空還是元素相同,結(jié)果都是相同的。

>>> a = [1,10,100,1000]
>>> b = [1,10,100,1000]
>>> a == b  
True
>>> a is b
False
>>> id(a)
12578024
>>> id(b)
12578056

接下來,我們轉(zhuǎn)到最后一個示例。第二個和最后一個示例之間的唯一區(qū)別是還有一行代碼 a = b,正是這行代碼改變了變量 a 的命運。以下結(jié)果將告訴你真實原因:

>>> a = 1000 
>>> b = 2000 
>>> id(a) 
2047616 
>>> id(b) 
5034992 
>>> a = b 
>>> id(a) 
5034992 
>>> id(b) 
5034992 
>>> a 
2000 
>>> b 
2000

如上所示,在 a = b 之后,a 的身份更改為 b 的身份。a = b 將 b 的身份分配給 a 。因此 a 和 b 具有相同的標識,因此 a 的值現(xiàn)在與 b 的值相同(即2000)。

最后一個示例告訴我們一個重要消息,即我們可能會無意中更改對象的值,而不會事先通知,尤其是當(dāng)對象是列表時。

>>> a = [1,2,3] 
>>> id(a) 
5237992 
>>> b = a 
>>> id(b) 
5237992 
>>> a.append(4) 
>>> a 
[1, 2, 3, 4] 
>>> b 
[1, 2, 3, 4]

在上面的示例中,由于 a 和 b 具有相同的標識,因此它們的值必須相同。 所以,在將新元素添加到 a 之后,b 的值也會受到影響。為避免這種情況,如果要將值從一個對象復(fù)制到另一個對象而不引用相同的標識,則所有方法之一是在 copy 模塊中使用 deepcopy 。 對于列表,我們還可以通過 b = a [:] 執(zhí)行。

>>> import copy 
>>> a = [1,2,3] 
>>> b= copy.deepcopy(a) 
>>> id(a) 
39785256 
>>> id(b) 
5237992

使用[:]將元素復(fù)制到新變量。

>>> a = [1,2,3] 
>>> id(a) 
39785256 
>>> b = a[:] 
>>> id(b) 
23850216 
>>> a.append(4) 
>>> a 
[1, 2, 3, 4] 
>>> b 
[1, 2, 3]

看完以上內(nèi)容,你是不是已經(jīng)充分了解了兩者之間的不同?如果面試遇到這種問題,千萬別回答錯啦!


分享名稱:詳解Python中的==”和“is
網(wǎng)頁地址:http://m.5511xx.com/article/cdgsgje.html