學習Python,is和==的本質區別你知道嗎?

在Python中,is和==都是用來對兩個對象進行比較判斷的,但兩者卻有本質的區別。

一:is操作符
is操作符是Python語言的一個內置操作符,它的作用是比較兩個變量是否指向同一塊內存區域,也就是判斷id(對象)是否相等。
當兩個變量是共享引用關係的話,它們指向的肯定是同一塊內存區域,用is判斷得到的結果肯定爲True。

>>> a = 10
>>> b = a
>>> a is b
True

如果是下面的這種情況呢?

>>> a,b = 10,10
>>> a is b
True
>>> id(a), id(b)
(1794638576, 1794638576)
>>> a,b = "abc","abc"
>>> a is b
True
>>> id(a), id(b)
(2281621304632, 2281621304632)
>>> a = (1,2,3)
>>> b = (1,2,3)
>>> id(a), id(b)
(2281620654120, 2281620654264)
>>> a is b
False
>>> a[0] is b[0]
True
>>> id(a[0]), id(b[0])
(1794638288, 1794638288)

從以上例子可以看到,當對象是數值類型或者字符串時,當兩個對象的值相等時,它們用is判斷的結果就爲True,這是因爲它們的id是相等的,而元組類型卻不是。在Python中,對於小整數和字符串類型,在創建一個數據對象時,會優先使用緩存中的數據,如果緩存中存在,就會使用同一個數據,對於大整數、浮點數、元組、列表、字典、集合這些數據類型,會重新創建一塊內存用於存儲數據對象,但它們的元素如果是小整數或字符串時,也會優先使用緩存數據,這也就能解釋了上面的爲什麼a[0]和b[0]的id是一樣的。
在Python3.5.2下測試,我們發現,-5-256這些小數字Python會使用緩存進行存儲。
學習Python,is和==的本質區別你知道嗎?

二、==操作符
==操作符用來判斷兩個對象的數據是否相等,而不用關注它們的id是否一致,例如:

>>> a = 10
>>> b = 10.0
>>> a == b
True
>>> id(a), id(b)
(1794638576, 2281597561472)

當兩個類的實例進行比較時,如果實例的數據一致時也不一定相等,如下:

class TestEqual():
    def __init__(self, u, v): 
        self.u = u
        self.v = v

a = TestEqual(3, 4)
b = TestEqual(3, 4)
print(a == b)  # 輸出結果爲False

爲了讓類的實例可以進行==比較,需要重新實現eq函數。

class TestEqual():
    def __init__(self, u, v): 
        self.u = u
        self.v = v

    def __eq__(self, other):
        if self.u== other.u:
            return True
        else:
            return False

a = TestEqual(3, 4)
b = TestEqual(3, 5)
print(a == b)  # 輸出結果爲True

從上面這個示例可以看出,在eq函數內部定義的邏輯是隻要u相等了,兩個類的實例就可以判定爲相等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章