is在python中的意思,pythonis和==的区别
在python中,==和is既有区别又有联系。本文将试图通过实际代码的演示,帮助阅读本文的朋友在最短的时间内理清它们之间的关系,深入理解它们在内存中的实现机制。
不瞎说的话,这里马上是我的第一张图:
通过对比上面的代码,我觉得很容易看出 is 是用来比较A和B是否指向同一个内存单元,而==是用来比较A和B所指向的内存单元中的值是否相等。敲下面的黑板。如果你自己的实验结果和我的不一致,请不要怀疑我或者你的编译器。我想你应该遇到过以下情况:
上图和第一张没什么区别,只是A和B的值从之前的500变成了3,但是结果和第一张不一样。我们发现此时IS和==都为真,A和B的地址完全相同。尼玛,该死,我们之前的理解是A对应的500和B对应的500不应该在同一个内存单元!其实这就是python解释器的鬼,具体是因为python的垃圾收集机制,下面的文章会详细介绍。至于上面的现象,是因为一个叫小整数对象池的东西。为了优化速度,python会提前将[-5,256]之间的数据存储在小整数对象池中,只要[-5,26]之间的数据就不会重新创建,都指向对象池中的相同数据。对于这个区间以外的数据,系统每次使用都会重新申请一块内存来存储数据,所以之前的现象并不奇怪。至此,“是”和“==”之间的恩怨似乎已经引入。我们单独来看看“==”。有没有想过python解释器在底层如何处理“==”,或者如何判断两个对象是否相等?对于数值型数据,只要两个数据大小相等,就是相等的,但是对于非数值型数据,比如字符串,比较类创建的对象是什么?答案是python默认比较两个对象的地址。有图有真相:我们发现上图中,p1和p2对象的内容是相同的,但是python编译器认为它们不相等。这时候就需要定义自己的规则来规定两个对象在什么条件下是相等的。具体操作需要重写python中的__eq__方法,通常称为运算符重载。下图显示了运算符重载后的操作。我们发现此时两个对象的值相等。
“==”和“是”的介绍到此结束。希望能帮助到之前对此感到困惑的小伙伴们。我先撤了。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。