中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

Python 中 "is" 與 "==" 操作有什么區(qū)別?

2018-07-20    來源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

在 Python 中,比較兩個對象(變量)是否相等,可以用 “is” 和 “==” 操作,但它倆有什么區(qū)別?什么時候用 “is”,什么時候用 “==” ?在面試時,發(fā)現(xiàn)不少候選人很難把這兩者完全說清楚,因此在這篇文章中,「Python之禪」將對二者進(jìn)行深入淺出的對比介紹。

先舉個例子

小黃最近手頭非常寬裕,花重金購買了一輛 P90D 特斯拉,我們暫且給這車取名叫 "小P" ,這輛車和隔壁老王家的車(車名叫 "小 王")是一模一樣的,無論是型號、外表還是價(jià)格都一樣,是同批次生產(chǎn)的。這里我們可以說 "小P" 和"小王"是兩輛一模一樣的、相等的( euqal ),但本質(zhì)上這是兩個不同的對象。有一天小君給他的愛車又取了一個網(wǎng)名叫 "愛駒",當(dāng)我們說 "小P" 的時候其實(shí)就是在討論 "愛駒",因?yàn)楸举|(zhì)上兩個名字指的是同一個對象,這里我們把 "小P" 和 "愛駒" 稱為完全相等的( identical )。

在 Python 中,”==” 和 “is” 的區(qū)別可類比這個例子 ,前者是相等性比較,比較的是兩個對象中的值是否相等,后者是一致性比較,比較的是兩個對象的內(nèi)存空間地址是否相同。

?顯然,如果內(nèi)存地址相同,那么他們的值肯定也是一樣的,因此,如果 “is” 返回 True,那么 “==” 一定也返回 True,反之卻不成立。

talk is cheap, show me the code

先創(chuàng)建一個列表對象,然后給它指定一個名字 a,再定義另外一個變量 b,讓它指向同一個對象。

>>> a = [1, 2, 3]
>>> b = a

a 和 b 打印的值都是相等的,因?yàn)檫@兩個變量指向的是同一個對象,就好比給一輛車起了兩個不同的名字。

>>> a
[1, 2, 3]
>>> b
[1, 2, 3]

理所當(dāng)然, is 和 == 都返回 True。

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

創(chuàng)建一個新的對象,盡管值是一樣的,但是他們本質(zhì)上是兩個不同的對象,處在兩個不同的內(nèi)存空間,因此 "is" 返回的是 False。

>>> c = [1,2,3]
>>> a is c
False

有且當(dāng)僅比較的兩個變量指向同一個對象時 "is" 才返回 True,而 "==" 最終取決于對象的 __eq__() 方法,本質(zhì)上兩個變量進(jìn)行 "==" 比較操作調(diào)用的是對象的 __eq__() 方法。例如:

>>> class Foo(object):
       def __eq__(self, other):
           return True

>>> f = Foo()
>>> f == 1
True
>>> f == None
True
>>> f is None
False

因?yàn)樽远x類 Foo 的 eq 方法恒返回 True,因此它與任何對象進(jìn)行 "==" 都是返回 True。而它與 None 是兩個不同的對象,因此 'is' 操作返回的是 False。

最后請大家思考這段代碼,為什么同樣的操作會有不同的結(jié)果

>>> a = 257
>>> b = 257
>>> a is b
False
>>> a = 123
>>> b = 123
>>> a is b
True

 

 

來自:https://foofish.net/what-is-difference-between-is-and-euqals.html

 

標(biāo)簽: 代碼

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:Android性能優(yōu)化系列之Bitmap圖片優(yōu)化

下一篇:iOS的那些面試