Python身份运算符与id()函数疑问:为何id(var_1) is id(var_1)返回False?
嘿,这个问题我刚学Python的时候也懵过,咱们一步步把它掰明白~
先搞懂
id()函数到底是干啥的 id(obj)函数的核心作用是返回对象在内存中的唯一整数标识——你可以把这个整数当成对象在内存里的“门牌号”,只要这个对象还活着,这个门牌号就不会变。
比如你定义var_1 = 10,var_1指向的是内存中存储整数10的那个对象,id(var_1)就会返回这个对象的门牌号。
为什么
print(id(var_1) is id(var_1))会返回False? 这是个很经典的“临时对象回收”+“小整数池”的组合坑,咱们拆解表达式的执行过程:
- Python先计算左边的
id(var_1):它会拿到var_1指向的10的内存地址(通常是一个很大的整数,比如140703324567616),然后创建一个临时的整数对象来存储这个地址值。 - 因为这个地址值远大于Python默认的小整数池范围(通常是-5到256),所以这个临时整数对象用完之后就会被Python的垃圾回收机制销毁。
- 接着计算右边的
id(var_1):同样拿到同一个地址值,但因为之前的临时对象已经被销毁了,Python会重新创建一个新的整数对象来存储这个值。 - 最后用
is运算符比较:is的本质是比较两个对象的内存地址,这两个临时整数对象虽然值相同,但内存地址不一样,所以返回False。
你可以试试这个更直观的例子验证:
var_1 = 10 # 先把两次id的结果存下来 id1 = id(var_1) id2 = id(var_1) print(id1 == id2) # 输出True,因为值相同 print(id1 is id2) # 如果id1是大整数,会输出False,因为是两个不同的对象
身份运算符
is的正确打开方式 如果你想判断一个变量是否指向同一个对象,直接比较变量本身就好:
var_1 = 10 print(var_1 is var_1) # 肯定返回True,因为是同一个对象
再补充个关键知识点:is和==的区别
is:检查两个变量是否指向同一个内存对象(门牌号一样)==:检查两个对象的值是否相等(内容一样)
比如:
a = [1,2,3] b = [1,2,3] print(a == b) # True,值相同 print(a is b) # False,是两个不同的列表对象,门牌号不一样
内容的提问来源于stack exchange,提问作者NANGA PARBAT SUMARNO
相关产品推荐
相关产品推荐

