溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

學(xué)習(xí)Python,is和==的本質(zhì)區(qū)別你知道嗎?

發(fā)布時(shí)間:2020-07-16 19:27:08 來源:網(wǎng)絡(luò) 閱讀:272 作者:dlhongmeng 欄目:編程語言

在Python中,is和==都是用來對(duì)兩個(gè)對(duì)象進(jìn)行比較判斷的,但兩者卻有本質(zhì)的區(qū)別。

一:is操作符
is操作符是Python語言的一個(gè)內(nèi)置操作符,它的作用是比較兩個(gè)變量是否指向同一塊內(nèi)存區(qū)域,也就是判斷id(對(duì)象)是否相等。
當(dāng)兩個(gè)變量是共享引用關(guān)系的話,它們指向的肯定是同一塊內(nèi)存區(qū)域,用is判斷得到的結(jié)果肯定為True。

>>> a = 10
>>> b = a
>>> a is b
True

如果是下面的這種情況呢?

>>> a,b = 10,10
>>> a is b
True
>>> id(a), id(b)
(1794638576, 1794638576)
>>> a,b = "abc","abc"
>>> a is b
True
>>> id(a), id(b)
(2281621304632, 2281621304632)
>>> a = (1,2,3)
>>> b = (1,2,3)
>>> id(a), id(b)
(2281620654120, 2281620654264)
>>> a is b
False
>>> a[0] is b[0]
True
>>> id(a[0]), id(b[0])
(1794638288, 1794638288)

從以上例子可以看到,當(dāng)對(duì)象是數(shù)值類型或者字符串時(shí),當(dāng)兩個(gè)對(duì)象的值相等時(shí),它們用is判斷的結(jié)果就為True,這是因?yàn)樗鼈兊膇d是相等的,而元組類型卻不是。在Python中,對(duì)于小整數(shù)和字符串類型,在創(chuàng)建一個(gè)數(shù)據(jù)對(duì)象時(shí),會(huì)優(yōu)先使用緩存中的數(shù)據(jù),如果緩存中存在,就會(huì)使用同一個(gè)數(shù)據(jù),對(duì)于大整數(shù)、浮點(diǎn)數(shù)、元組、列表、字典、集合這些數(shù)據(jù)類型,會(huì)重新創(chuàng)建一塊內(nèi)存用于存儲(chǔ)數(shù)據(jù)對(duì)象,但它們的元素如果是小整數(shù)或字符串時(shí),也會(huì)優(yōu)先使用緩存數(shù)據(jù),這也就能解釋了上面的為什么a[0]和b[0]的id是一樣的。
在Python3.5.2下測(cè)試,我們發(fā)現(xiàn),-5-256這些小數(shù)字Python會(huì)使用緩存進(jìn)行存儲(chǔ)。
學(xué)習(xí)Python,is和==的本質(zhì)區(qū)別你知道嗎?

二、==操作符
==操作符用來判斷兩個(gè)對(duì)象的數(shù)據(jù)是否相等,而不用關(guān)注它們的id是否一致,例如:

>>> a = 10
>>> b = 10.0
>>> a == b
True
>>> id(a), id(b)
(1794638576, 2281597561472)

當(dāng)兩個(gè)類的實(shí)例進(jìn)行比較時(shí),如果實(shí)例的數(shù)據(jù)一致時(shí)也不一定相等,如下:

class TestEqual():
    def __init__(self, u, v): 
        self.u = u
        self.v = v

a = TestEqual(3, 4)
b = TestEqual(3, 4)
print(a == b)  # 輸出結(jié)果為False

為了讓類的實(shí)例可以進(jìn)行==比較,需要重新實(shí)現(xiàn)eq函數(shù)。

class TestEqual():
    def __init__(self, u, v): 
        self.u = u
        self.v = v

    def __eq__(self, other):
        if self.u== other.u:
            return True
        else:
            return False

a = TestEqual(3, 4)
b = TestEqual(3, 5)
print(a == b)  # 輸出結(jié)果為True

從上面這個(gè)示例可以看出,在eq函數(shù)內(nèi)部定義的邏輯是只要u相等了,兩個(gè)類的實(shí)例就可以判定為相等。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI