为了账号安全,请及时绑定邮箱和手机立即绑定

python 中is 相当于比较两个对象的id,这个怎么解释

python 中is 相当于比较两个对象的id,这个怎么解释

幕布斯6054654 2019-02-22 07:34:36
def zhuangshi(cls): def inner(): pass return inner class A: pass print(zhuangshi(A) is zhuangshi(A)) print(id(zhuangshi(A)) == id(zhuangshi(A))) print(id(zhuangshi(A))) print(id(zhuangshi(A))) 控制台输出结果如下:FalseTrue3166541631665416惊呆! 为什么两个对象的内存地址都一样,为何 is 运行结果是false?
查看完整描述

3 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

print(zhuangshi(A) is zhuangshi(A))等价于
a, b = zhuangshi(A), zhuangshi(A)
print(a is b)  #False
print(id(a) == id(b)) #False

print(id(zhuangshi(A)) == id(zhuangshi(A)))等价于
a, b = id(zhuangshi(A)), id(zhuangshi(A))
print(a == b)    #True 两次id相同所以true
查看完整回答
反对 回复 2019-03-01
?
皈依舞

TA贡献1851条经验 获得超3个赞

== 是比较两个对象的值是否相等。
is 除了比较对象的值是否相等,还涉及到比较两个对象的内存地址是否相等。

>>> type(zhuangshi(A))
<class 'function'>
>>> zhuangshi(A)
<function zhuangshi.<locals>.inner at 0x7f7823a98b70> # 注意查看最后的内存地址
>>> zhuangshi(A)
<function zhuangshi.<locals>.inner at 0x7f78208ac7b8> # 注意查看最后的内存地址
>>> c, d = A, A
>>> type(c)
<class 'type'>
>>> type(d)
<class 'type'>
>>> c
<class '__main__.A'>
>>> d
<class '__main__.A'>
>>>
>>> c is d
True
>>>

综上比较,分明是 zhuangshi 这个类定义的是 返回一个 inner 对象,每次调用都会执行一次 inner 函数,所以调用的内存地址是不一样的。

查看完整回答
反对 回复 2019-03-01
  • 3 回答
  • 0 关注
  • 764 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信