Python中運算子"=="和"is"的差別分析

pythontab發表於2016-10-08

前言

在講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函式強制使用快取區。


相關文章