在python中,正确使用==与is ,需要清楚二者之间的区别和联系,以及适用范围。
1.应用于数值型的数据(如整数)
"=="是用来比较 a 和 b指向的内存地址中的值是否相等,相等就是True,不相等就是False。
" is" 是用来比较 a 和 b 是否指向同一个内存地址,相同就是True,不相同就是False,但适用范围是【-5,256】间的整数。超出此范围的同一整数用”is”比较,结果是False。
注:原因是python有个垃圾回收机制,为了优化速度,会把(-5,256)之间的数据提前存放在小整数对象池中,程序中只要用的是(-5,256)之间的数据不会再重新创建一个地址,都指向对象池中的同一份数据,除了这个区间之外的数据,每次使用时系统都会重新申请一块内存,用来存储数据。
>>> a=6
>>> b=6
>>> a==b
True
>>> a is b
True
>>> id(a)
1776126496 #a,b地址相同
>>> id(b)
1776126496
>>> a=257
>>> b=257
>>> a==b
True
>>> a is b
False
>>> id(a) #a,b地址不同
48394720
>>> id(b)
48395152
2.应用于非数值型的数据(如字符串,类创建的对象)
使用”==”,python默认去比较两个对象的地址,从以下代码中可以发现,p1和p2两个对象的内容完全相同,但是python编译器却认为其不相等,
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
p1=Person('张阳',20)
p2=Person('张阳',20)
print(id(p1))
print(id(p2))
print(p1==p2)
48314960
48542288
False
这就需要我们自己去定义规则规定在什么条件下两个对象是相等的,具体操作需要重写python中的__eq__方法,通常把这个过程叫做运算符重载。重载后两个对象的值是相等的。
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
def __eq__(self,other):
return self.name==other.name and self.age==other.age
p1=Person('张阳',20)
p2=Person('张阳',20)
print(id(p1))
print(id(p2))
print(p1==p2)
48446032
49066640
True