今天做个小测试,遇到一个这样子的问题: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既要关注内容,也要关注地址