a = = b является ложью, но идентификатор (a) == идентификатор (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?!

Что продолжается здесь?

13
задан Michael Mrozek 29 September 2015 в 05:11
поделиться

2 ответа

При оценке строки id (A .__ str__) == id (B .__ str __) , A .__ 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
11
ответ дан 1 December 2019 в 23:14
поделиться

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

>>> id(A.__str__.im_func) == id(A.__str__.im_func)
True
>>> id(B.__str__.im_func) == id(A.__str__.im_func)
False
8
ответ дан 1 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: