is:判断的是两个内存地址是否一致
==:判断的是两个变量的值是否一致
以上例子说明了is和==的区别,即a和b的值相等,但是在内存中的地址不一样,所以a==b返回的是True,a is b返回的是False。声明a=1000时,是在堆内存中为a开辟了一个值为1000的空间,a中保存的是这个数值的地址,b=1000,这时在内存中又开辟了一个值为1000的地址,在b中保存了该地址,这个地址与a中必然不同。
但是有一点需要注意的是,在数值在-5~256之间时,a==b和a is b返回的都是True,请看下面的例子:
这是因为在堆内存中开辟了一个小整型缓存区,数值在-5~256之间,这时在声明变量赋值在此数值范围中间时,变量a的引用就指向缓存区-5的位置,在a中保存的是-5的地址,b=a也就是b也保存了a中-5的地址,所以地址和值都是相同的。也是就说数值处于-5~256之间,系统不会再另外开辟空间,而是之间将a或者b的引用指向内存缓存区对应值的位置。
关于以上可用下面图示表明:
字符串也是如此,在此不过多赘述。