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