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
    
  • 相关阅读:
    257. Binary Tree Paths
    324. Wiggle Sort II
    315. Count of Smaller Numbers After Self
    350. Intersection of Two Arrays II
    295. Find Median from Data Stream
    289. Game of Life
    287. Find the Duplicate Number
    279. Perfect Squares
    384. Shuffle an Array
    E
  • 原文地址:https://www.cnblogs.com/amize/p/14820888.html
Copyright © 2011-2022 走看看