Python中is与==的使用区别
前言
要区分它俩的差别,首先要明白,python是面向对象的语言,在python里,一切皆对象,而对象有三大要素:id
、数据类型(type)
、值
。
知道了这个就能很好区分了,==
是比较两个对象的值是否相等,is
是比较id是否相等。
注意
使用is注意python对于小整数使用对象池存储问题,如果在[-5,256]之间,python对小整数在内存中直接创建了一份,不会回收,所有创建的小整数变量直接从对象池中引用。此时is相等,比如:
a = 1
b = 1
a is b # True
上面对于python小整数对象池的使用仅仅是在命令行中执行可以,而在Pycharm或者保存为文件执行,结果是不一样的,这是因为解释器做了一部分优化。下面使用pycharm,即使整数超过256,使用is也是成立的。
使用is注意python关于字符串的intern机制存储:
注意python中创建两个内容一样的变量时(变量名不一样),一般都会在内存中分配两个内存地址分别给这两个变量。即两个变量的内容虽然样,但是变量的引用地址不一样。所以两个变量使用==比较成立,但是使用 is比较不成立。
但是在python中有两个意外情况:
1.使用python命令行时对于小整数[-5,256]区间内的整数,python会创建小整数对象池,这些对象一旦创建,就不会回收,所有新创建的在这个范围的整数都是直接引用他即可。所以造成在[-5,256]区间内的整数不同变量只要值相同,引用地址也相同。此范围外的整数同样遵循新建一个变量赋予一个地址。
2.python中虽然字符串对象也是不可变对象,但python有个intern机制,简单说就是维护一个字典,这个字典维护已经创建字符串(key)和它的字符串对象的地址(value),每次创建字符串对象都会和这个字典比较,没有就创建,重复了就用指针进行引用就可以了。相当于python对于字符串也是采用了对象池原理。(但是注意:如果字符串(含有空格),不可修改,没开启intern机制,不共用对象。比如"a b"和"a b",这种情况使用is不成立的形式 只有在命令行中可以。使用pycharm同样是True,因为做了优化)
本文来自博客园,作者:27岁的太阳,转载请注明原文链接:https://www.cnblogs.com/isxjj/p/15981504.html