Ответ 1
Документация Python для функции id гласит:
Верните "идентификатор" объекта. Это целое число (или длинное целое число), которое гарантировано будет уникальным и постоянным для этого объекта в течение его жизни. Два объекта с неперекрывающимся временем жизни могут иметь одинаковое значение id().
(акцент мой)
Когда вы выполняете id(Hello.hello) == id(Hello.hello)
, объект метода создается только кратко и считается "мертвым" после первого вызова "id". Из-за вызова id
вам нужно всего лишь Hello.hello
быть живым в течение короткого периода времени - достаточно, чтобы получить идентификатор. Когда вы получите этот id, объект будет мертв, а второй Hello.hello
может повторно использовать этот адрес, что делает его похожим на то, что оба объекта имеют одинаковый идентификатор.
Это не похоже на выполнение Hello.hello is Hello.hello
- оба экземпляра должны жить достаточно долго, чтобы их можно было сравнивать друг с другом, поэтому у вас есть два живых экземпляра.
Если вы попробовали:
>>> a = Hello.hello
>>> b = Hello.hello
>>> id(a) == id(b)
False
... вы получите ожидаемое значение False
.