is 比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象,是否指向同一个内存地址。
**==**比较的是两个对象的内容是否相等,默认会调用对象的__eq__()方法。
但是在脚本模式和交互式模式下会有不一样的结果
交互式和脚本模式下 ,在 数据池内的小整数 ,范围[-5, 256],输出一致
##
交互式下
x =1
y =1
x == y # True
x is y # True
脚本模式下
x = 1
y = 1
x == y # True
x is y # True
不在数据池内的大整数
交互式下
x = 257
y =257
x == y # True
x is y # False
脚本模式下
x = 257
y =257
x == y # True
x is y # True
解释
1、小整数对象[-5,256]是全局解释器范围内被重复使用,永远不会被GC回收。所以无论脚本模式下或者是交互式模式下 ,小整数都式同一个地址。
2、同一个代码块中的不可变对象,只要值是相等的就不会重复创建新的对象。
什么是代码块:
一个模块文件、一个函数体、一个类、交互式命令中的单行代码都叫做一个代码块
所以在交互式模式下 x = 257 和y = 257 都是一个代码块,Python会创建新的内存空间
>>> id(x)
2848414157456
>>> id(y)
2848414157488
>>>
但是在脚本模式下,x = 257 与 y = 257 属于同一个代码块,python不会创建新的内存空间
a的id 2908547422320
b的id 2908547422320