Python 中 is 跟 == 的区别,还有其中的坑。

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





猜你喜欢

转载自blog.csdn.net/kidsanshi/article/details/80361672