1. 程式人生 > 其它 >Python中is與==的使用區別

Python中is與==的使用區別

前言

要區分它倆的差別,首先要明白,python是面向物件的語言,在python裡,一切皆物件,而物件有三大要素:id資料型別(type)

知道了這個就能很好區分了,==是比較兩個物件的值是否相等,is是比較id是否相等。

注意

使用is注意python對於小整數使用物件池儲存問題,如果在[-5,256]之間,python對小整數在記憶體中直接建立了一份,不會回收,所有建立的小整數變數直接從物件池中引用。此時is相等,比如:

a = 1
b = 1
a is b # True

上面對於python小整數物件池的使用僅僅是在命令列中執行可以,而在Pycharm或者儲存為檔案執行,結果是不一樣的,這是因為直譯器做了一部分優化。下面使用pycharm,即使整數超過256,使用is也是成立的。

使用is注意python關於字串的intern機制儲存:
注意python中建立兩個內容一樣的變數時(變數名不一樣),一般都會在記憶體中分配兩個記憶體地址分別給這兩個變數。即兩個變數的內容雖然樣,但是變數的引用地址不一樣。所以兩個變數使用==比較成立,但是使用 is比較不成立。

但是在python中有兩個意外情況:
1.使用python命令列時對於小整數[-5,256]區間內的整數,python會建立小整數物件池,這些物件一旦建立,就不會回收,所有新建立的在這個範圍的整數都是直接引用他即可。所以造成在[-5,256]區間內的整數不同變數只要值相同,引用地址也相同。此範圍外的整數同樣遵循新建一個變數賦予一個地址。

2.python中雖然字串物件也是不可變物件,但python有個intern機制,簡單說就是維護一個字典,這個字典維護已經建立字串(key)和它的字串物件的地址(value),每次建立字串物件都會和這個字典比較,沒有就建立,重複了就用指標進行引用就可以了。相當於python對於字串也是採用了物件池原理。(但是注意:如果字串(含有空格),不可修改,沒開啟intern機制,不共用物件。比如"a b"和"a b",這種情況使用is不成立的形式 只有在命令列中可以。使用pycharm同樣是True,因為做了優化)