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

关于id()方法的异常行为:为何id(a) is id(a)返回False?

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

这个问题其实涉及到Python的对象身份比较、id()函数的工作机制,以及Python的小整数缓存优化,咱们一步步拆解清楚:

先看a = 10; b = 10; print(a is b)返回True的原因

Python为了优化内存和性能,会对**-5到256之间的整数**进行预缓存(也就是常说的“小整数池”)。当你给a和b都赋值为10时,它们并没有各自创建新的整数对象,而是同时指向内存中那个预创建好的10对象。

is运算符的核心作用是比较两个变量是否指向同一个内存对象(注意和比较值相等的==区分开)。因为a和b指向的是小整数池里的同一个对象,所以a is b自然返回True。

再看a = 10; print(id(a) is id(a))返回False的原因

首先明确:id()函数返回的是对象的内存地址,这个地址会以整数的形式返回。那为什么两次调用id(a)得到的整数值明明相同,用is比较却返回False?

关键在这几点:

  • 每次调用id(a)时,Python都会创建一个临时的int对象来存储这个地址值。
  • 这个地址值通常是一个很大的整数(远超过256),不在小整数池的缓存范围内。
  • 两次调用id(a)会生成两个独立的临时int对象——它们的值相同,但内存地址完全不同。
  • is比较的是这两个临时对象的身份(内存地址),所以结果是False。

如果换成用==比较,print(id(a) == id(a))就会返回True,因为==只关心值是否相等,不关心对象身份。

总结两者的核心差异

  • a is b:比较的是a和b指向的原始整数对象(10)的身份,由于10在小整数池缓存中,所以是同一个对象,返回True。
  • id(a) is id(a):比较的是两次id()调用返回的临时大整数对象的身份,这些临时对象不在缓存池里,是独立创建的,所以返回False。

内容的提问来源于stack exchange,提问作者Paweł Bąkiewicz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:27:20