Short answer: see https://nedbatchelder.com/text/names.html to get a better understanding of the difference between objects and the names used to refer to objects.
A function is called if and only if you use parentheses. hello()
calls the function; hello
is simply a name bound to the function, and can be used, for example, to pass the function object as an argument to another function.
def caller(f):
f()
def hello():
print("hi")
def goodbye():
print("bye")
caller(hello) # Prints "hi"
caller(goodbye) # Prints "bye"
Regarding your update, id
returns different values because each call to id
receives a completely separate object as its argument. With id(hello)
, id
gets the function object itself. With id(hello())
, id
is getting the object returned by the call to hello
; it’s the same as
x = hello()
print(id(x))