Python3 & is 与 ==的比较
Python中的对象包含三要素:id(身份标识)、type(数据类型)、value(值)
id用来唯一标识一个对象,type标识对象的类型,value是对象的值
is判断的是a对象是否就是b对象,是通过id来判断的
==判断的是a对象的值是否和b对象的值相等,是通过value来判断的
Is
比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象,是否指向同一个内存地址。
id(object)函数是返回对象object在其生命周期内位于内存中的地址,id函数的参数类型是一个对象。
==
比较的是两个对象的内容是否相等,默认会调用对象的eq()方法。
示例:
命令行中执行以下代码

在Pycharm中执行以下代码
a = 257
b = 257
print(a==b) #True
print(a is b)#True
a1 = 1000000001111111111111
b1 = 1000000001111111111111
print(a1==b1) #True
print(a1 is b1)#True
a2 = 256
b2 = 256
print(a2 is b2)#True
出现上面这种现象是因为一个叫小整数对象池的东西,python为了优化速度,会把【-5,256】之间的数据提前存放在小整数对象池中,程序中只要用的【-5,256】之间的数据不会再重新申请一块内存,而是指向对象池中的同一份数据,除了这个区间之外的数据,每次使用时系统都会重新申请一块内存,用来存储数据。
比如整数10,即使我们在程序里没有创建它,其实在Python后台已经悄悄创建好了。这是因为在程序运行时,包括Python后台自己的运行环境中,会频繁使用这一范围内的整数,如果每需要一个,就创建一个,无疑会增加很多开销。
所以创建一个一直存在,永不销毁,随用随拿的小整数对象池,无疑是个比较实惠的做法。
而在Pycharm或者保存为文件执行时,输出结果和命令行中不一样,这是因为解释器做了一部分优化。
总结:
1、is 比较两个对象的 id 值是否相等,是否指向同一个内存地址;
2、== 比较的是两个对象的内容是否相等,值是否相等;
3、小整数对象[-5,256]是全局解释器范围内被重复使用,永远不会被GC回收;
4、同一个代码块中的不可变对象,只要值是相等的就不会重复创建新的对象。
5、is 运算符比 == 效率高,在变量和None进行比较时,应该使用 is。
6、is 比 == 检查更严格,is 返回True表明这两个对象指向同一块内存,值也一定相同。