您好,登錄后才能下訂單哦!
在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會使用緩存進行存儲。
二、==操作符
==操作符用來判斷兩個對象的數據是否相等,而不用關注它們的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相等了,兩個類的實例就可以判定為相等。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。