python中的==和is
这里是我找了相关的资料来解释了==和is的区别
直接看例子吧
从这两个小例子可以看到,变量赋值和=号赋值是不一样的,变量赋值是改变了变量的指向,而等号赋值是重新开辟了一块内存,所以第二个例子中a和b的地址不同,对于is和==,is用来判断内存地址是否相同即为是否为同一个对象,而==是判断值是否相等,接着再看下面的例子
奇怪了,刚刚=赋值时说明是新开辟了一块内存,这里的例子怎么内存地址是一样的??先不急,继续往下看
这就更奇怪了!地址又变得相同了,难道这是随机分配的吗??当然不是,这个例子和上面的例子唯一的不同是a和b赋值的大小不同,一个为1,一个为500,这里就要引出一个小整数池的东西,python为了优化速度,会把【-5,256】之间的数据提前存放在小整数对象池中,程序中只要使用的【-5,256】之间的数据就不会再重新创建一份,都是指向对象池中的同一份数据,除了这个区间之外的数据,每次使用时系统都会重新申请一块内存,用来存储数据,这样就解释的通了!
除了小整数池还有一个intern的机制,都是为了节约内存的,请看string对象的intern机制https://blog.****.net/f1ngf1ngy1ng/article/details/80484376
我们继续看==和is,上面已经说过了,is用来判断内存地址是否相同即为是否为同一个对象,而==是判断值是否相等,又出来一个问题,对于数值类型的数据,只要两个数据大小相等,那么就是相等,但是对于非数值型的数据,比如字符串,类创建的对象又是比较的,比较什么呢?这就要看下==在python解释器的底层是如何运行的了,还是看例子
所以对于非数值型的数据,python默认去比较两个对象的地址,==在底层调用的是__eq__方法,可以重写这个方法,有兴趣可以找找源码看看