使用python的“ ==” 和“ is”容易出错的环节

在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值