函数的本质是什么?

函数和函数名到底是一种什么关系?


函数的本质

在 python 中一切皆对象, 那么函数也不例外, 也是一种对象.

从本质上看, 一个函数与一个整数没有本质的区别, 仅仅是他们表示的数据类型不同而已!

看下面的代码:

def foo():
    pass


print(foo)  # 这里只打印了函数名, 并没有调用 foo 函数

print(abs)  # 直接打印内置函数, 而没有调用

说明:

  1. 从结果可以看出来, 直接把函数本身打印出来了, 自定义的函数与at后面的可以理解成函数在内存中的地址

  2. 如果是 python 内置函数会告诉你这是个内置函数.

  3. 你可以把函数想象中以前的数字一样, 仅仅表示内存中的一个对象.


函数名和函数的关系

其实函数名和以前的变量名没有本质的区别, 变量名是指向对象的一个符号, 那么函数名也是指向对象的一个符号.


动态把函数名赋值给新变量

根据前面的理解, 函数名其实就是一个指向函数对象的变量.

那么我们是不是可以再创建一个变量也指向那个函数对象呢?

答案是肯定的!

def foo():
    print("我是 foo 函数内的代码")


a = foo

print(a)
print(foo)

a()

说明:

  1. 你会发现直接打印a 和 foo的结果完全一样, 证明他们确实是指向了同一个函数对象

  2. 调用 a() 执行的就是foo函数内的代码. 因为他们其实就是一个对象.


给函数名重新赋值

既然函数名是变量名, 那么函数名也应该可以重新赋值!

def foo():
    print("我是 foo 函数内的代码")


foo = 3

foo()

说明:

因为函数名已经被赋值为了整数,所以再调用就会抛出异常.

Copyright © 李振超 2018 all right reserved,powered by Gitbook
该文件最后修订时间: 2018-02-25 07:12:09

results matching ""

    No results matching ""