函数的本质是什么?
函数和函数名到底是一种什么关系?
函数的本质
在 python 中一切皆对象, 那么函数也不例外, 也是一种对象.
从本质上看, 一个函数与一个整数没有本质的区别, 仅仅是他们表示的数据类型不同而已!
看下面的代码:
def foo():
pass
print(foo) # 这里只打印了函数名, 并没有调用 foo 函数
print(abs) # 直接打印内置函数, 而没有调用
说明:
从结果可以看出来, 直接把函数本身打印出来了, 自定义的函数与
at
后面的可以理解成函数在内存中的地址如果是 python 内置函数会告诉你这是个内置函数.
你可以把函数想象中以前的数字一样, 仅仅表示内存中的一个对象.
函数名和函数的关系
其实函数名和以前的变量名没有本质的区别, 变量名是指向对象的一个符号, 那么函数名也是指向对象的一个符号.
动态把函数名赋值给新变量
根据前面的理解, 函数名其实就是一个指向函数对象的变量.
那么我们是不是可以再创建一个变量也指向那个函数对象呢?
答案是肯定的!
def foo():
print("我是 foo 函数内的代码")
a = foo
print(a)
print(foo)
a()
说明:
你会发现直接打印
a 和 foo
的结果完全一样, 证明他们确实是指向了同一个函数对象调用
a()
执行的就是foo
函数内的代码. 因为他们其实就是一个对象.
给函数名重新赋值
既然函数名是变量名, 那么函数名也应该可以重新赋值!
def foo():
print("我是 foo 函数内的代码")
foo = 3
foo()
说明:
因为函数名已经被赋值为了整数,所以再调用就会抛出异常.