is和==

作者: bigtom | 来源:发表于2016-09-19 11:13 被阅读49次

    is

    [] is []  # False
    [] == []  # True
    

    初学者看到上面的代码肯定会觉得有点奇怪。别急,还有更奇怪的

    a = 256
    b = 256
    a is b  # True
    
    a = 257
    b = 257
    a is b # False
    
    a = 257
    b = a
    a is b # True
    

    解释

    is操作比较的是对象的id,对每个对象而言都有一个id

    a = []
    b = []
    print id(a), id(b)
    

    上面的代码输出两个不同的整数,而在内存中,a和b也是分别存储的。但是下面的代码就不一样了

    a = []
    b = a
    print id(a), id(b)
    

    上面的代码输出两个相同的整数,在内存中a,b也是相同的。
    这样我们也就理解了a = 257,b = 257的情况

    但是为啥

    a = 256
    b = 256
    a is b  # True
    

    其实是因为python为了优化,避免生成太多小整数对象(最常使用的对象),维护了一个small int对象池,所有在0到256的对象都直接从对象池里拿,而不是另外生成。

    ==

    上面我们也看到了 [] == []是True,那么==背后的机理是什么呢?

    class A:
        def __init__(self,x):
            self.x = x
    
    a = A(1)
    b = A(1)
    print a == b #False
    

    上面的例子中a和b对象都拥有相同的属性,但是却为不等。
    为啥两个list可以根据元素是否相同判断是否相等呢?

    解释

    print dir(list)
    

    我们发现,list有一个属性为eq,这就是秘密所在,我们在对对象进行判断相等性的时候,就会调用这个函数

    class A:
        def __init__(self,x):
            self.x = x
    
        def __eq__(self, other):
            return self.x == other.x
    
    a = A(1)
    b = A(1)
    print a == b #True
    

    现在,只要A类的对象拥有相等的x属性,它们就相等

    相关文章

      网友评论

          本文标题:is和==

          本文链接:https://www.haomeiwen.com/subject/vmzgettx.html