This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: same object, same method, but the is keyword return false.
Type: behavior Stage: resolved
Components: Versions: Python 3.6
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: lgj1993, steven.daprano
Priority: normal Keywords:

Created on 2019-03-02 02:16 by lgj1993, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Messages (2)
msg336979 - (view) Author: lgj (lgj1993) Date: 2019-03-02 02:16
>>> class A():
...   def a(self):
...       pass
...
>>> a = A()
>>> a is a
True
>>> a.a is a.a
False
>>> id(a.a)
4532803784
>>> id(a.a)
4532803784
It's seems quite oops.
msg336981 - (view) Author: Steven D'Aprano (steven.daprano) * (Python committer) Date: 2019-03-02 02:36
The ``is`` operator returns False because the two objects are different objects.

Methods are descriptors, and whenever you access an instance method, you get a brand-new method object. This is described in the documentation for descriptors:

https://docs.python.org/3/howto/descriptor.html#functions-and-methods

The last two tests in your example both call id(a.a), which returns the same ID number for precisely the same reason as we explained in your previous bug report #36156. Since the two "a.a" method objects don't exist at the same time, the interpreter is permitted to re-use the same ID number for them.

P.S. remember in the previous bug report you raised, I asked you to use less awkward and confusing names? "a.a" is a terrible name, even for a simple example like this. It makes it hard to talk about what is going on when "a" is an instance and also a method.
History
Date User Action Args
2022-04-11 14:59:11adminsetgithub: 80344
2019-03-02 02:36:48steven.dapranosetstatus: open -> closed

nosy: + steven.daprano
messages: + msg336981

resolution: not a bug
stage: resolved
2019-03-02 02:16:43lgj1993create