Python中is與==區別的實例解析

Y2J
發布: 2017-04-21 16:06:45
原創
1116 人瀏覽過

在python中,is檢查兩個物件是否是同一個物件,而==檢查他們是否相等.這樣說起來很簡單,我們透過具體的實例來分析吧

在Python 中,比較兩個物件(變數)是否相等,可以用「is」 和「==」 來操作,但它兩個有什麼不同?什麼時候用 “is”,什麼時候用 “==” ?在面試時,發現不少候選人很難把這兩者完全說清楚,因此在這篇文章中,「Python之禪」將對二者進行深入淺出的對比介紹。

先舉例

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

在Python 中,”==” 和“is” 的區別可類比這個例子,前者是相等性比較,比較的是兩個物件中的值是否相等,後者是一致性比較,比較的是兩個物件的記憶體空間位址是否相同。

顯然,如果記憶體位址相同,那麼他們的值肯定也是一樣的,因此,如果 「is」 回傳 True,那麼 「==」 一定也回傳 True,反之卻不成立。

talk is cheap, show me the code

先建立一個列表對象,然後給它指定一個名字 a,再定義另一個變數 b,讓它指向同一個對象。

>>> a = [1, 2, 3]
>>> b = a
登入後複製

a 和 b 列印的值都是相等的,因為這兩個變數指向的是同一個對象,就好比給一輛車取了兩個不同的名字。

>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
登入後複製

理所當然, is 和 == 都會回傳 True。

>>> a == b
True
>>> a is b
True
登入後複製

建立一個新的對象,儘管值是一樣的,但是他們本質上是兩個不同的對象,處在兩個不同的記憶體空間,因此 "is" 返回的是 False。

>>> c = [1,2,3]
>>> a is c
False
登入後複製

有且當只比較的兩個變數指向同一個物件時"is" 才傳回True,而"==" 最終取決於物件的eq() 方法,本質上兩個變數進行" ==" 比較操作呼叫的是物件的eq() 方法。例如:

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

>>> f = Foo()
>>> f == 1
True
>>> f == None
True
>>> f is None
False
登入後複製

因為自訂類別 Foo 的 eq 方法恆返回 True,因此它與任何物件進行 "==" 都是傳回 True。而它與 None 是兩個不同的對象,因此 'is' 操作返回的是 False。

最後請大家思考這段程式碼,為什麼同樣的操作會有不同的結果

>>> a = 257
>>> b = 257
>>> a is b
False
>>> a = 123
>>> b = 123
>>> a is b
True
登入後複製

#總結:

如果你要比較兩個值是否相同就用==,如果比較是否是同一個物件就用is.

其實python中的is比較的物件很像C語言中的指標,只有位址相同的指標才是同一個指針.

以上是Python中is與==區別的實例解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板