【20221107每日面经】is 和 == 有什么区别

每日面经

  • 考察点: Python 基础知识

  • 题目: 如果你在面试过程中,被面试官问到:说一下在 python 中判断两个对象相等 is 和 == 有什么区别,你会如何回答呢?

2 个赞

is和==都可以对两个对象进行比较,而且它们的返回值都是bool值。
is比较的时候,需要两个对象的内存地址一致,举例如下:

# 值对比
>>> 1 == True
True

# 地址对比
>>> 1 is True
False
>>> id(1)
4483178624
>>> id(True)
4482774496

来源于网络:

事实上Python 为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。而Python 对小整数的定义是 [-5, 257),只有数字在-5到256之间它们的id才会相等,超过了这个范围就不行了,同样的道理,字符串对象也有一个类似的缓冲池,超过区间范围内自然不会相等了。**

总的来说,只有数值型和字符串型,并且在通用对象池中的情况下,a is b才为True,否则当a和b是int,str,tuple,list,dict或set型时,a is b均为False。

之前没有了解过这个问题,进来学习一下,参考上面同学们的回答编写一个用来「面试」的答案:

对象有三个属性:标识(id)、类型(type)和值(value)

  • is 比较的是 两个对象的标识
  • == 比较的是 两个对象的值

另外补充一下,因为Python存在一些优化机制,使部分数字和字符串在赋值的时候会使用特定对象池中的已有标识,而不会另外申请额外内存空间(标识)。

所以会导致如下情况:

>>> a = 1
>>> b = 1
>>> a is b
True

>>> a = 1000
>>> b = 1000
>>> a is b
False

因赋值时的特殊机制导致的复杂情况,不建议 is 用在判断是否为 True/False/None 以外的比较场景

1 个赞


怎么我试了 都是返回true

百度出来的解释见下面的文章,看起来赋值时的机制比我前面描述得更复杂 :joy:

谢谢 试了下 确实是那么回事