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
相关产品推荐
相关产品推荐

