Python 中 "is" 與 "==" 有啥區別?

在 Python 中,比較兩個對象(變量)是否相等,能夠用 「is」 和 「==」 操做,但它倆有什麼區別?何時用 「is」,何時用 「==」 ?在面試時,發現很多候選人很難把這二者徹底說清楚,所以在這篇文章中,「Python之禪」將對兩者進行深刻淺出的對比介紹。html

先舉個例子python

小黃最近手頭很是寬裕,花重金購買了一輛 P90D 特斯拉,咱們暫且給這車取名叫 "小P" ,這輛車和隔壁老王家的車(車名叫 "小 王")是如出一轍的,不管是型號、外表仍是價格都同樣,是同批次生產的。這裏咱們能夠說 "小P" 和"小王"是兩輛如出一轍的、相等的(euqal),但本質上這是兩個不一樣的對象。有一天小君給他的愛車又取了一個網名叫 "愛駒",當咱們說 "小P" 的時候其實就是在討論 "愛駒",由於本質上兩個名字指的是同一個對象,這裏咱們把 "小P" 和 "愛駒" 稱爲徹底相等的(identical)。面試

在 Python 中,」==」 和 「is」 的區別可類比這個例子 ,前者是相等性比較,比較的是兩個對象中的值是否相等,後者是一致性比較,比較的是兩個對象的內存空間地址是否相同。ide

​顯然,若是內存地址相同,那麼他們的值確定也是同樣的,所以,若是 「is」 返回 True,那麼 「==」 必定也返回 True,反之卻不成立。spa

talk is cheap, show me the code.net

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

>>> a = [1, 2, 3]
>>> b = a複製代碼

a 和 b 打印的值都是相等的,由於這兩個變量指向的是同一個對象,就比如給一輛車起了兩個不一樣的名字。cdn

>>> a
[1, 2, 3]
>>> b
[1, 2, 3]複製代碼

理所固然, is 和 == 都返回 True。htm

>>> 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複製代碼

同步發表於博客:foofish.net/what-is-dif…
公衆號:Python之禪 (id:VTtalk),分享 Python 等技術乾貨

python之禪
相關文章
相關標籤/搜索