当前位置: 平码三中三 > 平码三中三论坛 >

is 与 有区别吗?深入理解 Python中 is 与 的差异

更新时间:2019-10-04

  在Python中对象之间比较是否相等可以用==,也可以用 is。因此也容易造成一些理解上的模糊,那两者是否有所区别呢?

  在介绍is 与 == 的区别之前,首先要了解一下Python中对象的三个基本要素:

  is比较的是两个对象的Id是否相同,也就是比较两个对象是否为同一个实例对象,是否指向同一个内存地址,is为同一性运算符。

  ==比较的是两个对象的Value是否相等,默认会调用对象的eq()方法,==为比较操作符。

  因此,我们也可以得出:如果两个对象相同(Id相同),则必然也相等(值相等),但如果两个对象相等,并不一定相同。所以在实际应用时,要有所区分,避免混用导致出现逻辑Bug。

  执行上述代码,我们可以看到如下打印信息,正如上面所说,同一性运算符is比较的是两个对象的Id是否相同,比较操作符 ==比较的是两个对象的值是否相等。

  因为,Python解释器为了提高整数类型使用的效率和使用性能,其内部做了很多的优化工作,对于整数对象,Python把一部分频繁使用的整数对象缓存起来,保存到小整数对象池缓存(small_ints)的链表中(Python2 为 [-5, 256] ,Python3 未知),任何需要引用这些整数对象的地方,都不再重新创建新的对象,而是直接引用缓存中的对象。

  因为,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化,例如:Python解释器中使用了intern(字符串驻留)的技术来提高字符串效率,即值同样的字符串对象仅仅会保存一份,放在一个字符串储蓄池中,需要注意的是,仅包括下划线、数字、国家税务总局举行升国旗仪式,字母的字符串才会被intern,同时不能超过20个字符。因为如果超过20个字符的话,解释器认为这个字符串不常用,不用放入字符串池中。

  因此,六合宝典,当变量是数字、字符串、元组,列表,字典时,is 和 == 都不相同, 不能互换使用。当比较对象的值时,需使用 ==,比较对象Id(内存地址)时,需要使用is。