现象
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 还是有区别的。
先说结论
- == 判断的是两个对象的值是否相等
- is 判断的是两个对象的内存地址是否相等
- 在值相同的情况下,可变对象的内存地址不同,不可变对象的内存地址相同
什么意思
== 判断的是两个对象的值是否相等
像上面的第二个例子,l1 和 l2 的值长得就完全一样,所以他们 == 的比较结果就是 True。说白了 == 两边只要长得完全一样那返回的结果就是 True ,反之返回False。唯一有些不同的是数字,不光比较长相,还比较最后的运算结果。
is 判断的是两个对象的内存地址是否相等
通过内置函数id()可以查看对象在内存中的地址。is 判断的就是这两个对象的内存地址,而不管他们的值是否相同。长得不同的对象,它们的内存地址肯定也不同。长得相同的对象,他们的内存地址也不一定相同。当然,数字依然要看最后的计算结果。
在值相同的情况下,可变对象的内存地址不同,不可变对象的内存地址相同
可变对象包括:列表、字典、集合。不可变对象包括:字符串、元祖、数字。还是上面第二个例子。虽然 l1 和 l2 长的完全一样,也就是值相同。但是,列表是一个可变对象,通过id函数可以知道他们的内存地址是并不相等的。