gpt4 book ai didi

python - Python中的 "a is b"和 "id(a) == id(b)"有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 21:54:48 25 4
gpt4 key购买 nike

id()内置函数给出...

an integer (or long integer) which is guaranteed to be unique and constant for this object during its lifetime.

is相反,运算符给出...

object identity

那么为什么可能有两个对象具有相同的 id 但返回 Falseis 检查?这是一个例子:

>>> class Test():
... def test():
... pass
>>> a = Test()
>>> b = Test()
>>> id(a.test) == id(b.test)
True
>>> a.test is b.test
False

一个更令人不安的例子:(继续上面的)

>>> b = a
>>> b is a
True
>>> b.test is a.test
False
>>> a.test is a.test
False

但是:

>>> new_improved_test_method = lambda: None
>>> a.test = new_improved_test_method
>>> a.test is a.test
True

最佳答案

>>> b.test is a.test
False
>>> a.test is a.test
False

方法是在您每次查找时即时创建的。函数对象(始终是同一个对象)实现了 descriptor protocol它的 __get__ 创建绑定(bind)的方法对象。没有两个绑定(bind)方法通常是同一个对象。

>>> id(a.test) == id(b.test)
True
>>> a.test is b.test
False

这个例子具有欺骗性。第一个结果只是 True 巧合。 a.test 创建一个绑定(bind)方法,并在计算 id(a.test) 后将其作为垃圾收集,因为没有任何对它的引用。 (请注意,您引用文档说 id 是“此对象在其生命周期内 的唯一且恒定的”(强调我的)。) b.test 发生 拥有与之前绑定(bind)的方法相同的 id 并且允许这样做,因为现在没有其他对象具有相同的 id。

请注意,您应该很少使用 is,更不要经常使用 idid(foo) == id(bar) 总是错的。


关于您的新示例,希望您能得到它现在的功能:

>>> new_improved_test_method = lambda: None
>>> a.test = new_improved_test_method
>>> a.test is a.test
True

在这种情况下,我们不会从类上的函数自动绑定(bind)自身并返回绑定(bind)的方法对象来动态创建方法。在这种情况下,您只需将函数存储为实例属性。查找时没有什么特别的事情发生(只有在查找类属性时才会调用描述符),所以每次查找属性时,都会得到存储的原始对象。

关于python - Python中的 "a is b"和 "id(a) == id(b)"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2906177/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com