You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中==与is运算符疑问:为何id(a) is id(b)返回False?

为什么id(a) is id(b)返回False?

嘿,这个问题踩中了Python里一个容易被忽略的细节,我来给你一步步拆解清楚:

首先先确认你已经知道的基础:

  • == 用来比较两个对象的值是否相等
  • is 用来比较两个对象的身份是否相同(也就是是否指向内存中的同一个对象)

那问题出在哪呢?关键在于 id() 函数的返回值本身:

1. id() 返回的是整数,但每次调用生成的是临时整数对象

id(obj) 会返回一个整数,表示对象 obj 的内存地址。但注意:这个返回的整数本身也是一个Python对象。

当你执行 id(a) is id(b) 时,实际发生的是:

  • 先调用 id(a),生成一个值为182798416的整数对象(假设内存地址是X)
  • 再调用 id(b),生成另一个值为182798416的整数对象(假设内存地址是Y)
  • 最后用 is 比较这两个整数对象的身份,因为X≠Y,所以返回False

而 id(a) == id(b) 比较的是这两个整数对象的值,值都是182798416,所以返回True。

2. 为什么直接写182798416 is 182798416返回True?

这是Python的编译器优化:当在同一个表达式中出现相同的整数字面量时,Python会复用同一个整数对象,避免重复创建。所以这两个182798416实际上是同一个对象,用is比较自然返回True。

补充:关于你的a和b的id相同的小细节

你可能会疑惑,为什么a = 1000000000和b = 1000000000的id相同?毕竟通常Python只会缓存-5到256之间的小整数。这是因为在同一个代码块(比如脚本文件)中,Python会对相同的大整数字面量进行复用优化,所以a和b指向了同一个对象。但如果是在交互式环境中分开执行这两行,a和b的id可能就不同了哦。

总结一下:用is比较id()的返回值没有意义,因为id()每次返回的整数对象都是临时创建的,哪怕值相同,身份也可能不同。如果要比较两个对象的身份,直接用a is b就可以了,不需要绕一圈用id()。

内容的提问来源于stack exchange,提问作者MrSoLoDoLo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:34:31