Python中 is 和 == 的区别

>>> a = 'hello'
>>> b = 'hello'
>>> a is b
True
>>> a == b
True
>>> a = 'hello world'
>>> b=  'hello world'
>>> a is b
False
>>> a == b
True
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a is b
False
>>> a == b
True
>>> a = [1, 2, 3]
>>> b = a
>>> a is b
True
>>> a == b
True

是不是很诧异,a, b都是‘hello’的时候is和==都是True,为什么是‘hello world’的时候就不一样了呢?

官方文档中说:

is 表示的是对象标示符(object identity),而 == 表示的是相等(equality)。is 的作用是用来检查对象的标示符是否一致,也就是比较两个对象在内存中的地址是否一样,而 == 是用来检查两个对象是否相等。我们在检查 a is b 的时候,其实相当于检查 id(a) == id(b)。而检查 a == b 的时候,实际是调用了对象 a 的 eq() 方法,a == b 相当于 a.eq(b)。一般情况下,如果 a is b 返回True的话,即 a 和 b 指向同一块内存地址的话,a == b 也返回True,即 a 和 b 的值也相等。

前面的问题涉及到python字符串的驻留机制:

  • 在交互模式下,每行字符串字面量都会申请一个新字符串,但是只含大小写字母、数字和下划线的会被intern(驻留),也就是维护了一张dict来使得这些字符串全局唯一。

所以,‘hello world’包含空格,不会驻留,所以两者不同。

>>> c = 'fdsafdsafdsafdsafhdsalfhdsiafhsadhfkdsahfkasdgfkasdgfksadgfkasdf'
>>> d = 'fdsafdsafdsafdsafhdsalfhdsiafhsadhfkdsahfkasdgfkasdgfksadgfkasdf'
>>> c is d
True
>>> m = 'a b'
>>> n = 'a b'
>>> m is n
False
>>> x = 'a_b12'
>>> y = 'a_b12'
>>> x is y
True
>>> x == y
True
>>>

总结:is 是检查两个对象是否指向同一块内存空间,而 == 是检查他们的值是否相等。可以看出,is 是比 == 更严格的检查,is 返回True表明这两个对象指向同一块内存,值也一定相同。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容