python基础(8)python中is和==的区别详解
前置知识点
当我们创建一个对象时,我们要知道它内部干了些什么
- 1.创建了一个随机id,开辟了一片内存地址
- 2.自动声明了这个对象的类型type
- 3.给这个对象赋值value
小例子
a = 1
print(id(1))
print(id(a))
print(type(a))
结果
4470700832
4470700832
<class 'int'>
可以明显看出数字1的内存地址跟对象a的内存地址是一样的,a = 1
的原理是首先内存中有一个id=4470700832
,type=int
,value=1
的对象,然后创建a对象指向1,此时a的id、type、value跟1的一样
is和==的区别
上面分析了创建对象的整个内存过程,那么接下来理解is和==的区别就好多了
- is:用于判断两个变量引用对象是否为同一个,既比较对象的地址。
- ==:用于判断引用变量引用对象的值是否相等,默认调用对象的
__eq__()
方法。
>>> a = 257
>>> b = 257
>>> id(a)
140204598140720
>>> id(b)
140204598140400
>>> print(a is b)
False
>>> print(a == b)
True
根据我们上面讲解的,a的地址和b的地址应该跟257的地址相同,但是现在显然不同,这是为什么呢?下面会说明
整数缓存问题
Python 仅仅对比较小的整数对象进行缓存(范围为[-5, 256])
缓存起来,而并非是所有整数对象。需要注意的是,这仅仅是在命令行中执行,而在Pycharm
或者保存为文件执行,结果是不一样 的,这是因为解释器做了一部分优化(范围是[-5,任意正整数])。
总结
- is 比较两个对象的 id 值是否相等,是否指向同一个内存地址
- == 比较的是两个对象的内容是否相等,值是否相等
- 小整数对象[-5,256]在全局解释器范围内被放入缓存供重复使用
- is 运算符比 == 效率高,在变量和 None 进行比较时,应该使用 is。