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
皈依舞
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 函数,所以调用的内存地址是不一样的。
添加回答
举报
0/150
提交
取消