a == b является ложным, но id (a) == id (b) истинно?

Выполните следующие действия:

>>> 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?! 

Что тут происходит?

    3 Solutions collect form web for “a == b является ложным, но id (a) == id (b) истинно?”

    Когда id(A.__str__) == id(B.__str__) строки id(A.__str__) == id(B.__str__) , A.__str__ , его идентификатор, а затем собран мусор. Затем B.__str__ как B.__str__ , заканчивается на том же адресе, что и раньше. A.__str__ был раньше, поэтому он получает (в CPython) один и тот же идентификатор.

    Попробуйте назначить A.__str__ и B.__str__ временным переменным, и вы увидите что-то другое:

     >>> f = A.__str__ >>> g = B.__str__ >>> id(f) == id(g) False 

    Для более простого примера этого явления попробуйте:

     >>> id(float('3.0')) == id(float('4.0')) True 

    Следующие работы:

     >>> id(A.__str__.im_func) == id(A.__str__.im_func) True >>> id(B.__str__.im_func) == id(A.__str__.im_func) False 

    Для тех из нас, кого здесь привлекает ваше название, чтобы определить, был ли метод переопределен:

     class A: def __str__(self): return "some A()" def strWasOverridden(self): return A.__str__ != self.__str__ 
    Python - лучший язык программирования в мире.