a == b是假的,但是id(a)== id(b)是真的吗?

bb.*_*bb. 13 python methods overriding object

进入以下几点:

>>> class A:
...     def __str__(self):
...             return "some A()"
... 
>>> class B(A):
...     def __str__(self):
...             return "some B()"
... 
>>> print A()
some A()
>>> print B()
some B()
>>> A.__str__ == B.__str__
False # seems reasonable, since each method is an object
>>> id(A.__str__)==id(B.__str__)
True # what?!
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

Mar*_*son 11

id(A.__str__) == id(B.__str__)评估字符串时,A.__str__会创建其ID,然后进行垃圾回收.然后B.__str__创建,并发生在A.__str__最初与之前完全相同的地址,因此它(在CPython中)获得相同的id.

尝试分配A.__str__B.__str__临时变量,你会看到不同的东西:

>>> f = A.__str__
>>> g = B.__str__
>>> id(f) == id(g)
False
Run Code Online (Sandbox Code Playgroud)

有关此现象的更简单示例,请尝试:

>>> id(float('3.0')) == id(float('4.0'))
True
Run Code Online (Sandbox Code Playgroud)

  • @jldupont:Python在运行时创建未绑定的方法`A .__ str __和`B .__ str__`.http://users.rcn.com/python/download/Descriptor.htm是底层机制的一个很好的参考. (2认同)

hon*_*zas 8

以下作品:

>>> id(A.__str__.im_func) == id(A.__str__.im_func)
True
>>> id(B.__str__.im_func) == id(A.__str__.im_func)
False
Run Code Online (Sandbox Code Playgroud)