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