(I edited the question, since I think it is still basically the same thing I'm asking, though I gained some understanding from the comments. I don't know if that's permitted, or I should have asked a new one.)
The following code
class A: c = lambda:0
a = A()
print(a.c is a.c)
prints False. I have learned it's because Python thinks A.c is a method, since c is assigned a function at class level. I have two questions:
(less important) How does Python decide whether something is a function? I thought it would have to be def'd explicitly if it were to become a method. "Arbitrary callable" obviously isn't the criterion: for example, builtin functions aren't accepted.
(more important) I learned that "Whenever you look up a method via class.name or instance.name, the method object is created a-new". Is there any implementation-independent reason why is it so? That is, is there any language feature that wouldn't work right if copies weren't made? (Of course, I know that a1.c is not a2.c, but for same object a, could a.c always be the same object? Or at least, could A.c always be the same object?)