在講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函數強制使用快取區。
以上是關於Python中運算子"=="和"is"的差異使用分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!