首頁  >  文章  >  後端開發  >  關於Python中運算子"=="和"is"的差異使用分析

關於Python中運算子"=="和"is"的差異使用分析

高洛峰
高洛峰原創
2017-03-16 16:21:531031瀏覽

前言

在講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中文網其他相關文章!

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