zoukankan      html  css  js  c++  java
  • python的string interning(字符串驻留)机制【坑】

    1. 结论【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
    
  • 相关阅读:
    从一个网页上摘取想要的元素
    Oracle数据库迁移
    java 内部类
    关于robot framework 环境搭建的几点注意
    robotframework 页面已经locate到元素 但是操作提示element is no longer valid!
    转 PyQt学习资料
    Java 大数值
    【转】Excel 使用技巧
    Java调用WebService
    String StringBuffer StringBuider
  • 原文地址:https://www.cnblogs.com/amize/p/14820888.html
Copyright © 2011-2022 走看看