每日面经
-
考察点: Python 基础知识
-
题目: 如果你在面试过程中,被面试官问到:说一下在 python 中判断两个对象相等 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
以外的比较场景
百度出来的解释见下面的文章,看起来赋值时的机制比我前面描述得更复杂
谢谢 试了下 确实是那么回事