![]() |
is 与 == 有区别吗?深入理解 Python中 is 与 == 的差异 |
珠江路在线
2019年9月9日
【
转载
】软件测试开发技术栈 编辑:
|
|
在Python中对象中间 比较是不是相等 能够用==,也 能够用 is 。 因而也方便造成一些 了解上的含糊,那两者是不是有所区别呢?
在介绍is 与 == 的区别之前,首先要了解一下Python中对象的三个 根本 因素:
- Id:身份标识,内存地址,用来唯一标识一个对象
- Type:数据类型
- Value:值
is 比较的是两个对象的 Id 是不是 雷同,也便是 比较两个对象是不是为同一个实例对象,是不是指向同一个内存地址,is 为同一性运算符 。
== 比较的是两个对象的Value 是不是相等,默许会调用对象的eq() 步骤,==为 比较操作符 。
因而,我们也 能够得出:假如两个对象 雷同(Id 雷同),则必定也相等(值相等),但假如两个对象相等,并不 定然 雷同 。所以在实际 利用时,要有所 划分,幸免混用招致浮现逻辑Bug 。
通过例子,进一步 了解 is 与 == 的区别
执行上述代码,我们 能够看到如下打印信息,正如上面所说,同一性运算符is 比较的是两个对象的Id是不是 雷同, 比较操作符 == 比较的是两个对象的值是不是相等 。
有没有一些状况下 is 和 == 后果 彻底 雷同?
数字类型
执行上述例子中的代码,我们来看一下输出信息,如下:
为何256时,is 与 == 的 比较 后果 雷同, 而1089时却不同?
由于,Python解释器为了 遍及整数类型 使用的效率和 使用性能,其内部做了众多的优化工作,关于整数对象,Python把一 部分频繁 使用的整数对象缓存起来, 保留到小整数对象池缓存(small_ints)的链表中(Python2 为 [-5, 256] ,Python3 未知),任何需求 引用这些整数对象的地方,都不再再一次 创立新的对象,而是直接 引用缓存中的对象 。
字符串类型
执行上述例子中的代码,我们来看一下输出信息,如下:
为何同样都是 'abc' 时,is 与 == 的 比较 后果 雷同, 而'adcadcadcadcadcadcadc'时却不同?
由于,Python解释器为了 遍及字符串 使用的效率和 使用性能,做了众多优化,例如:Python解释器中 使用了 intern(字符串驻留)的技术来 遍及字符串效率,即值同样的字符串对象仅仅会 保留一份,放在一个字符串储蓄池中,需求 留神的是,仅包含下划线、数字、字母的字符串才会被intern,同时不能超过20个字符 。由于假如超过20个字符的话,解释器认为这个字符串不常用,不用放入字符串池中 。
因而,当变量是数字、字符串、元组,列表,字典时,is 和 == 都不 雷同, 不能 调换 使用 。当 比较对象的值时,需 使用 ==, 比较对象Id(内存地址)时,需求 使用is 。