python基礎(8)python中is和==的區別詳解

Silent丿丶黑羽發表於2021-03-09

前置知識點

當我們建立一個物件時,我們要知道它內部幹了些什麼

  • 1.建立了一個隨機id,開闢了一片記憶體地址
  • 2.自動宣告瞭這個物件的型別type
  • 3.給這個物件賦值value
     

小例子

a = 1
print(id(1))
print(id(a))
print(type(a))

結果

4470700832
4470700832
<class 'int'>

可以明顯看出數字1的記憶體地址跟物件a的記憶體地址是一樣的,a = 1的原理是首先記憶體中有一個id=4470700832type=intvalue=1的物件,然後建立a物件指向1,此時a的id、type、value跟1的一樣
 

is和==的區別

上面分析了建立物件的整個記憶體過程,那麼接下來理解is和==的區別就好多了

  • is:用於判斷兩個變數引用物件是否為同一個,既比較物件的地址。
  • ==:用於判斷引用變數引用物件的值是否相等,預設呼叫物件的 __eq__()方法。
>>> a = 257
>>> b = 257
>>> id(a)
140204598140720
>>> id(b)
140204598140400
>>> print(a is b)
False
>>> print(a == b)
True

根據我們上面講解的,a的地址和b的地址應該跟257的地址相同,但是現在顯然不同,這是為什麼呢?下面會說明
 

整數快取問題

Python 僅僅對比較小的整數物件進行快取(範圍為[-5, 256])快取起來,而並非是所有整數物件。需要注意的是,這僅僅是在命令列中執行,而在Pycharm或者儲存為檔案執行,結果是不一樣 的,這是因為直譯器做了一部分優化(範圍是[-5,任意正整數])。
 

總結

  • is 比較兩個物件的 id 值是否相等,是否指向同一個記憶體地址
  • == 比較的是兩個物件的內容是否相等,值是否相等
  • 小整數物件[-5,256]在全域性直譯器範圍內被放入快取供重複使用
  • is 運算子比 == 效率高,在變數和 None 進行比較時,應該使用 is。

相關文章