深入理解 Python 的 “==” 和 “is”

  • is 是比较两个引用是否指向了同一个对象(比较的是内存地址是否一致)。
  • == 是比较两个对象是否相等。
Python 3.6.0 |Anaconda 4.3.1 (64-bit)| (default, Dec 23 2016, 11:57:41) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.

>>> obj1 = ["a", "b", "c"]
>>> obj2 = obj1
>>> obj1 is obj2
True
>>> id(obj1)
2104722816712
>>> id(obj2)
2104722816712
>>> obj2 = obj1[:]
>>> obj2 is obj1
False
>>> id(obj1)
2104722816712
>>> id(obj2)
2104722796360
>>> obj1 == obj2
True

实现原理
is 比较的是两者是否是同一个对象,所以比较的是内存地址(id是否相同)。
== 是值比较。不可变对象,,例如 int,str,它会直接进行值比较。对于Python已知的对象,会调用他们的 eq 函数来比较。(其实已知的对象应该也是通过内置的 eq 函数来比较的)。对于自定义的对象,如果实现了 eq 函数,就会使用它比较,如果没有实现,效果和 == 是一样的。

对象缓存机制
Python会对比较小的对象缓存,下次用到比较小的对象时,会去缓存区查找,如果找到,不会再开辟新的内存,而是继续把小对象的地址赋给新的值:

>>> obj1 = 1
>>> obj2 = 1
>>> obj1 is obj2
True

>>> obj1 = 257
>>> obj2 = 257
>>> obj1 is obj2
False
>>> obj1 =256
>>> obj2 =256
>>> obj1 is obj2
True

>>> obj2 = -5
>>> obj1 = -5
>>> obj1 is obj2
True
>>> obj2 = -6
>>> obj1 = -6
>>> obj1 is obj2
False
#-5至257之间使用相同的数字,指向的同一片内存空间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值