python中的 is 與 比較

2022-07-24 04:09:10 字數 1843 閱讀 9214

在 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中的變數無...