相对于较小的字符串,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 aTrue>>> a == aFalse
总结 以上是内存溢出为你收集整理的python的string interning(字符串驻留)机制【坑】全部内容,希望文章能够帮你解决python的string interning(字符串驻留)机制【坑】所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)