在 python 中會用到物件之間比較,可以用 ==,也可以用 is 。但是它們的區別是什麼呢?
可以通過如下例子來區分比較下:
>>> a = ["i", "love", "python"]
>>> b = a
# a的引用複製給b,在記憶體中其實是指向了用乙個物件
>>> b is a
true
>>> id(a)
46381384
>>> id(b)
46381384
# 當然,內容也肯定是相等的
>>> b == a
true
可以發現b和a的記憶體位址是相同的,它們指向同一塊記憶體,因而 is 和 == 的結果都為true。這是因為直接賦值都是賦值的引用,是引用,是引用,重要的事情說三遍。但如果不是通過引用賦值,而是通過切片賦值呢?
# b通過切片操作重新分配了物件,但是值和a相同
>>> b = a[:]
>>> b is a
false
>>> id(a)
48740680
>>> id(b)
48740680
>>> b == a # 但他們的值還是相等的
true
新建物件之後,b 和 a 指向了不同的記憶體,所以 b is a 的結果為false,而 b==a的結果為true。在這裡,小編提乙個問題,b[0] is a[0] 的結果呢?
答案是true。因為切片拷貝是淺拷貝,列表中的元素並未重新建立。不理解的同學請翻看之前的文章python中的淺拷貝和深拷貝。
通常,我們關注的是值,而不是記憶體位址,因此 python **中 == 出現的頻率比 is 高。但是什麼時候用 is 呢?
is 與 == 相比有乙個比較大的優勢,就是計算速度快,因為它不能過載,不用進行特殊的函式呼叫,少了函式呼叫的開銷而直接比較兩個整數 id。而 a == b 則是等同於a.__eq__(b)。繼承自 object 的__eq__方法比較兩個物件的id,結果與 is 一樣。但是多數python的物件會覆蓋object的__eq__方法,而定義內容的相關比較,所以比較的是物件屬性的值。
a is none
a is not none
python會對比較小的整數物件進行快取,下次用的時候直接從快取中獲取,所以is 和 == 的結果可能相同:
>>> a = 1
>>> b = 1
>>> a is b
true
>>> a == b
true
而看一下另外一段**:
>>> a = 257
>>> b = 257
>>> a is b
false
這是什麼原因呢?
注意,python僅僅對比較小的整數物件進行快取(範圍為範圍[-5, 256])快取起來,而並非是所有整數物件。需要注意的是,這僅僅是在命令列中執行,而在pycharm或者儲存為檔案執行,結果是不一樣的,這是因為直譯器做了一部分優化。
總結1、is 比較兩個物件的 id 值是否相等,是否指向同乙個記憶體位址;
2、== 比較的是兩個物件的內容是否相等,值是否相等;
3、小整數物件[-5,256]在全域性直譯器範圍內被放入快取供重複使用;
4、is 運算子比 == 效率高,在變數和none進行比較時,應該使用 is。
python中is與 的比較
學習了其他語言例如r或c之後,忽然發現python與眾不同地有兩種比較運算子,is與 那麼這兩種運算子有什麼區別?python中物件包含的三個基本要素 id 身份標識 type 資料型別 value 值 is is not是身份運算子,用於比較兩個例項物件的唯一身份標識,也就是id是否相同 id 函...
Python與Ruby的比較
轉 ruby和python的比較 http www.chinesepython.org cgi bin moingb ruby ba cdpython b5 c4 b1 c8 bd cf python和ruby的相同點 和python相比ruby的優點 python可以實現在列表內的條件語句 迴圈語...
python與C的比較
python的大致語法結構與c類似,但是又有著區別。迴圈 python的迴圈沒有了c的 取而代之的是 並且for迴圈是 x in y的形式出現,而不是三段式。退出等均和c相同,以break退出,但是python中的選擇結構中是if,elif而不是c中的if elseif。變數 python中的變數無...