一、表示含義不同
Python中,==用於比較兩個對象的值是否相等,而is則用於比較兩個對象的標識是否相等。
值相等表示兩個對象所包含的數據相同;而標識相等則表示兩個對象的地址相同,指向同一塊內存地址。
==重載了__eq__()方法,is則重載了__cmp__()方法。
二、內存管理不同
在Python中,賦值操作實際上是創建對象,並把對象的引用賦值給變數。因此,當多個變數指向同一對象時,它們不僅值相等,而且標識也相等。
a = [1, 2, 3] b = [1, 2, 3] c = a a == b # True,因為a和b的值相等 a is b # False,因為它們的地址不同 a is c # True,因為它們的地址相同
但是,當Python在內部優化時,可能會在單個進程中對一些對象進行重複使用,以節省內存。這意味著,對於較小的整數、字元串和空列表,is可能返回True。
三、可變對象和不可變對象比較結果不同
Python中,可變對象指可以在原地修改的對象,例如列表和字典;不可變對象指不能在原地修改的對象,例如數字和字元串。
對於不可變對象,==和is的比較結果一致。
a = 10 b = 10 c = 11 a == b # True,因為它們的值相等 a is b # True,因為它們的標識相等 a == c # False,因為它們的值不相等 a is c # False,因為它們的標識不相等
但是對於可變對象,兩者的比較結果就會不同。
a = [1, 2, 3] b = [1, 2, 3] c = a a == b # True,因為它們的值相等 a is b # False,因為它們的標識不相等 a is c # True,因為它們的地址相同,都指向同一塊內存地址 a[0] = 4 print(a) # [4, 2, 3] print(c) # [4, 2, 3] print(b) # [1, 2, 3]
四、緩存機制改變比較結果
對於小數字和空字元串,在Python2.7的實現中,它們被緩存,以減少對象創建的開銷。
a = 257 b = 257 a == b # True,它們的值相等 a is b # False,因為它們的標識不相等
但是在Python3.7的實現中,數字和字元串被緩存的範圍擴大了:
a = 10 b = 10 a == b # True,它們的值相等 a is b # True,它們的標識相等 a = '' b = '' a == b # True,它們的值相等 a is b # True,它們的標識相等
五、注意事項
當使用is時,必須小心。由於Python的存儲機制,is可能返回True,而相應的值比較可能返回False。
a = 'hello' b = ''.join(['h', 'e', 'l', 'l', 'o']) a == b # True,它們的值相等 a is b # False,它們的標識不相等
此外,is與None的比較是一種推薦的Python風格:
a = None if a is None: print('a is None')
原創文章,作者:UOSPY,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/360897.html