首頁  >  文章  >  後端開發  >  Python中運算子'=='和'is'的詳解

Python中運算子'=='和'is'的詳解

WBOY
WBOY原創
2016-12-05 13:27:201162瀏覽

前言

在講is和==這兩種運算子區別之前,首先要知道Python中物件包含的三個基本要素,分別是:id(身份識別)、python type()(資料類型)和value(值) 。 is和==都是對物件進行比較判斷作用的,但對物件比較判斷的內容並不相同。下面來看看具體差別在哪。

Python中比較兩個物件是否相等,總共有兩種方法,簡單來說,它們的差異如下:

     is是比較兩個引用是否指向了同一個物件(引用比較)。

     ==是比較兩個物件是否相等。

>>> a = [1, 2, 3]
>>> b = a
>>> b is a # a的引用复制给b,他们在内存中其实是指向了用一个对象
True 
>>> b == a # 当然,他们的值也是相等的
True
>>> b = a[:] # b通过a切片获得a的部分,这里的切片操作重新分配了对象,
>>> b is a # 所以指向的不是同一个对象了
False
>>> b == a # 但他们的值还是相等的
True

實現原理

is比較的是兩者是否是同一個對象,所以比較的是記憶體位址(id是否相同)。

==是數值比較。不可變對象,例如int,str,它會直接進行值比較。對於Python已知的對象,會呼叫他們的__eq__函數來比較。 (其實已知的物件應該也是透過內建的__eq__函數來比較的)。對於自訂的對象,如果實現了__eq__函數,就會使用它比較,如果沒有實現,效果和==是一樣的。

物件快取機制

Python會對比較小的物件緩存,下次用到比較小的物件時,會去緩存區查找,如果找到,不會再開闢新的內存,而是繼續把小物件的位址賦給新的值。例:

>>> c = 1
>>> d = 1
>>> print(c is d) 
True
 
>>> 1000 is 10**3
False
>>> 1000 == 10**3
True

透過計算得到的賦值,不會使用快取區。從第一個程式碼範例中可以看出。

對於字串,你可以透過使用intern函數強制使用快取區。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或工作能帶來一定的幫助,如果有疑問大家可以留言交流。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn