- 结论【is不适合来判断两个字符串是否相等】
相对于较小的字符串,Python为了提高性能会保留其值的一个副本,当你再次创建这个字符串的时候,直接就指向了这个副本,所以'hello'这个字符串是在内存中有一个副本的,所以a和b的id的值是一样的;
而a1和b1是长字符串,并不会驻留,Python在内存中分别为a1和b1创建了一个内存对象来标识a1和b1,所以这两个对象拥有相同的内容但是标识符是不一样的,所以==的值为True而is的值为False。
实际上造成上面输出结果不一致的根本原因在于is的作用在于用来检查对象的标识符是否一致,也就是说is是比较两个对象在内存中是否拥有同一块内存空间,它并不适合来判断两个字符串是否相等。
a is b仅当a和b是同一个对象的时候才返回True, 所以a is b基本上相当于id(a) == id(b)。
而==才是真正用来判断两个对象的值是否相等的,它实际调用的是builtins.py中的__eq__()方法,因此a == b相当于a.__eq__()b, 所以 == 操作符可以被重载,而 is 是不能被重载的。
一般情况下如果a is b为True的话a == b的值也是True,反之则亦然。 特殊情况除外,如下所示:
>>> a = float('NaN')
>>> a is a
True
>>> a == a
False