前置知識點
當我們建立一個物件時,我們要知道它內部幹了些什麼
- 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=4470700832
,type=int
,value=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。