現(xiàn)象
1 + 1 == 2
1 + 1 is 2
True
True
運行以上兩段代碼的話,所得到的結果都會是True。這么看起來 == 和 is 的功能貌似是一樣的。
l1 = [1, 2, 3, 4]
l2 = [1, 2, 3, 4]
print(l1 == l2)
print(l1 is l2)
True
False
以上的代碼,== 打印的 True ,而 is 打印的 False 。這么看 == 和 is 還是有區(qū)別的。
先說結論
- == 判斷的是兩個對象的值是否相等
- is 判斷的是兩個對象的內存地址是否相等
- 在值相同的情況下,可變對象的內存地址不同,不可變對象的內存地址相同
什么意思
== 判斷的是兩個對象的值是否相等
像上面的第二個例子,l1 和 l2 的值長得就完全一樣,所以他們 == 的比較結果就是 True。說白了 == 兩邊只要長得完全一樣那返回的結果就是 True ,反之返回False。唯一有些不同的是數(shù)字,不光比較長相,還比較最后的運算結果。
is 判斷的是兩個對象的內存地址是否相等
通過內置函數(shù)id()可以查看對象在內存中的地址。is 判斷的就是這兩個對象的內存地址,而不管他們的值是否相同。長得不同的對象,它們的內存地址肯定也不同。長得相同的對象,他們的內存地址也不一定相同。當然,數(shù)字依然要看最后的計算結果。
在值相同的情況下,可變對象的內存地址不同,不可變對象的內存地址相同
可變對象包括:列表、字典、集合。不可變對象包括:字符串、元祖、數(shù)字。還是上面第二個例子。雖然 l1 和 l2 長的完全一樣,也就是值相同。但是,列表是一個可變對象,通過id函數(shù)可以知道他們的內存地址是并不相等的。