Perhaps I chose the wrong example for names before, a second example might make things clearer. You need to separate between immutable objects like integer numbers and mutable objects like lists.
a = ["red"]
b = a
a = 5
If you combine this with the above example the overall view is better. Names are just references to objects. Some objects are mutable (can be changed) others are immutable (integers, floats, tuples etc.).
Back to the function question, it is not like an instance. It is exactly the same object. If you wanted some confirmation you could use the
id() function (in CPython this is the memory address). Here is another example of the same function object being passed around-
def func ():
new_label = func
# Functions are not mutable exactly but you can bind additional attributes to
# a function object
func.attr = 3
# But it is still the same object (with the same attrbiutes)
Python is perfectly happy assigning multiple references to the same object. In fact that is how lists and similar operate. They are a sequence of references to other objects.
In this way copying, or slicing a list does not require copying every underlying object, it just copies the references (there are tools to perform deep instead of shallow copies but they are used less frequently).