“与”的区别是什么;a是b;及;id(a)==id(b)";用Python?

“与”的区别是什么;a是b;及;id(a)==id(b)";用Python?,python,identity,Python,Identity,内置函数提供 一个整数(或长整数),保证该对象在其生存期内唯一且不变 相反,接线员给出 对象标识 那么,为什么可能有两个对象具有相同的id,但返回False到is检查?以下是一个例子: >>> class Test(): ... def test(): ... pass >>> a = Test() >>> b = Test() >>> id(a.test) == id(b.test) True >>

内置函数提供

一个整数(或长整数),保证该对象在其生存期内唯一且不变

相反,接线员给出

对象标识

那么,为什么可能有两个对象具有相同的
id
,但返回
False
is
检查?以下是一个例子:

>>> class Test():
...   def test():
...     pass
>>> a = Test()
>>> b = Test()
>>> id(a.test) == id(b.test)
True
>>> a.test is b.test
False
一个更麻烦的例子:(继续上面的内容)

然而:

>>> new_improved_test_method = lambda: None
>>> a.test = new_improved_test_method
>>> a.test is a.test
True
方法是在每次查找时动态创建的。函数对象(始终是同一个对象)实现了,并且它的
\uuuu get\uuuu
创建绑定方法对象。没有两个绑定方法通常是同一个对象

>>> id(a.test) == id(b.test)
True
>>> a.test is b.test
False
这个例子具有欺骗性。第一个的结果只是巧合地
True
a.test
创建绑定方法,并在计算
id(a.test)
后对其进行垃圾收集,因为没有对它的任何引用。(请注意,您引用的文档中说,id“在其生命周期内对此对象是唯一且恒定的”(emphasis mine)。
b.test
恰好与您以前使用的绑定方法具有相同的id,因为现在没有其他对象具有相同的id

请注意,您应该很少使用
is
,甚至更少使用
id
id(foo)==id(bar)
总是错误的


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

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

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

我并不需要这些来完成实际的程序或元类绝地思维把戏,请注意。我在火车上很无聊,我试过:)我想重要的问题是为什么
a.test是a.test
是假的。一旦你知道剩下的应该是有意义的…石油泄漏很好,很快就会来到你附近的一个城市!也许你应该组织一些聚会来庆祝它的到来!==而且是完全独立的。这里有一个例子,is并不意味着平等<代码>a=浮点('nan');打印a是a,a==a@Paul:我没有问
a==b
,我问的是
id(a)==id(b)
:)“每次查找方法时都会动态创建它们。函数对象(始终是同一个对象)实现描述符协议,它的
\uuuuu get\uuuuu
创建绑定方法对象。通常没有两个绑定方法是同一个对象。“哈,这对我来说是新闻。美好的
>>> id(a.test) == id(b.test)
True
>>> a.test is b.test
False
>>> new_improved_test_method = lambda: None
>>> a.test = new_improved_test_method
>>> a.test is a.test
True