>>> 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表明这两个对象指向同一块内存,值也一定相同。
网友评论