猿问

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

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)))

控制台输出结果如下:
False
True
31665416
31665416
惊呆! 为什么两个对象的内存地址都一样,为何 is 运行结果是false?

幕布斯6054654
浏览 765回答 3
3回答

慕盖茨4494581

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

皈依舞

== 是比较两个对象的值是否相等。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 函数,所以调用的内存地址是不一样的。
随时随地看视频慕课网APP

相关分类

Python
我要回答