别再混淆了 is 和 ==的区别

是不是刚学Python没多久的童鞋们,就经常被 is== 搞得晕头转向?明明看起来两个变量值都一样,用 is 判断却返回False?又或者有时候用 is 居然又能判断相等?别急,很多时候都会在这个坑里摔一跤。

先来说个最直接的结论吧:== 检查的是值是否相等 ,而 is 检查的是是不是同一个对象。哎,别着急别着急!我知道这句话你可能已经在官方文档里看过一百遍了,但还是似懂非懂。没关系,我们慢慢来讲。

举个生活中的例子,你和你兄弟碰巧买了同款手机,型号、颜色、内存全都一模一样。这时候:

  • == 相当于问:"这两部手机型号一样吗?"(答案是肯定的)
  • is 相当于问:"这是同一部手机吗?"(答案是否定的)

看懂了吧?== 只关心值is 则关心的是身份

来看一个简单的测试例子!

python 复制代码
a = [1, 2, 3]
b = [1, 2, 3]

print(a == b)  
print(a is b) 

看看控制台输出的结果:

上面的例子很符合直觉对吧?a和b虽然是两个不同的列表,但内容完全一样,所以 == 为True,而 is 为False。

但是!但是! 看一个这个测试的例子最容易懵B的地方了:

python 复制代码
x = 256
y = 256
print(x is y)  # 输出 True

什么鬼?!为什么256的时候 is 为True为什么跟上面的执行结果不一样,难道Python针对我?

别急,这不是bug,而是Python的一个优化机制在作怪:小整数缓存 。Python为了性能考虑,会把一些常用的整数(通常是-5到256)预先创建好对象存起来。当你使用这个范围内的数字时,Python直接给你返回已经创建好的那个对象,所以这些数字的 is 判断就会是True。

小插曲: 那么有的童鞋们就问了这个说的通常范围是-5到256,那我为什么输入比如说6666,返回的也是True呢?

执行结果如下:

这是因为解释器的实现差异问题:小整数缓存是 CPython 特有的实现细节,并非 Python 语言规范的要求。

字符串也有类似的情况,叫做字符串驻留

python 复制代码
s1 = "hello"
s2 = "hello"
print(s1 is s2)  # 通常输出 True

s3 = "hello world!"
s4 = "hello world!"
print(s3 is s4)  # 可能输出 False

短字符串通常会被Python缓存,但较长的字符串就有可能不会了。注意,我用了"通常"和"可能",因为这种行为取决于具体的Python实现版本,不是语言规范要求的!

特殊情况:None、True、False

这三个家伙在Python中是单例对象,也就是说整个程序中只有一个None、一个True、一个False。所以对于它们,你应该总是使用 is 来比较:

python 复制代码
if value is None:  # 推荐
if value == None:  # 不推荐

if condition is True:  # 有时候可以,但通常直接 if condition 更好

什么时候用 is,什么时候用 ==

简单来说:

  • 当你关心 是否相等时,用 ==
  • 当你关心身份 是否相同时,用 is

99%的情况下,你都是在比较值,所以应该用 ==。那什么时候用 is 呢?主要是:

  1. 判断是否为None、True、False时
  2. 确实需要检查两个变量是否指向同一个对象时(比如在操作可变对象时)

记住这几个要点:

  1. == 比较值,is 比较对象身份(内存地址)
  2. 不要用小整数缓存和字符串驻留的特性来写代码!这些是实现细节,可能变化
  3. 判断None、True、False时用 is
  4. 其他绝大多数情况都用 ==

最后送大家一句话:如果你不确定该用哪个,那就用 ==,这样至少不会因为Python的内部优化机制而踩坑。

希望这篇文章能帮你理清 is== 的区别。没有蠢问题,只有还没理解的概念!

相关推荐
love530love11 小时前
EPGF 架构下的 Python 环境变量设置建议——Anaconda 路径精简后暴露 python 及工具到环境变量的配置记录 [三]
开发语言·人工智能·windows·python·架构·conda·epgf 架构
moxiaoran575312 小时前
Springboot实现WebSocket通信(二)
spring boot·后端·websocket
Q_Q51100828512 小时前
python+springboot毕业季旅游一站式定制服务系统
java·spring boot·python·django·flask·node.js·旅游
摩羯座-1856903059413 小时前
VVIC 平台商品详情接口高效调用方案:从签名验证到数据解析全流程
java·前端·数据库·爬虫·python
会跑的葫芦怪14 小时前
Golang 赋值运算符与短声明 (= 与 :=)使用场景
开发语言·后端·golang
数据知道14 小时前
Go基础:Go语言函数和方法详解
开发语言·后端·golang·go语言
我是华为OD~HR~栗栗呀14 小时前
华为od-前端面经-22届非科班
java·前端·c++·后端·python·华为od·华为
用什么都重名15 小时前
不同版本tensorflow推理报错解决方法
人工智能·python·tensorflow·librosa
reasonsummer15 小时前
【办公类-109-05】20250923插班生圆牌卡片改良01:一人2个圆牌(接送卡&被子卡&床卡&入园卡_word编辑单面)
人工智能·python·sklearn
开开心心就好16 小时前
PDF清晰度提升工具,让模糊文档变清晰
java·服务器·前端·python·智能手机·pdf·ocr