python基礎(8)python中is和==的區別詳解
前置知識點
當我們創建一個對象時,我們要知道它內部幹了些什麼
- 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。