今天做个小测试,遇到一个这样子的问题:
1.a=1,b=1;a==b,a is b 布尔运算为什么?
2.a=100,b=100;a==b,a is b布尔运算结果为什么?
3.a=300,b=300;a==b,a is b布尔运算结果为什么?
结果真的让人大吃一惊:
>>> a = 1 >>> b = 1 >>> a is b True >>> a == b True >>> a = 100 >>> b = 100 >>> a is b True >>> a == b True >>> a = 300 >>> b = 300 >>> a is b False >>> a == b True
为了探寻真正的问题,接着玩了下面的代码:
>>> a = 1 >>> a is 1 True >>> a = 300 >>> a is 300 False
这就奇了怪了,a被赋值300,跟300 is 布尔,居然是False。继续追寻原因,Python中,变量只是"标签",用来引用常量。常量是由地址“ID”和内容“VALUE”组成,内容那么相同常量的地址“ID”就应该一样嘛,继续玩代码:
>>> a = 1 >>> id(a) 505986472 >>> id(1) 505986472 >>> a = 300 >>> id(a) 19209728 >>> id(300) 20092144
嗯? 当常量是300的时候,id值不一样了,查资料吧。原来在《Pyhton源代码剖析》这本书,有small_int的容器这个概念,small_int的范围-5到256。
上面提到了常量的组成方式,那么就很容易得出is和==的区别:
1.==只关注常量里面的内容。
2.is既要关注内容,也要关注地址