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属性,它们就相等