def test():
print('这是 test 函数的内部代码...')
func_obj = test
func_obj()
这是 test 函数的内部代码...
上述代码定义了一个test()
函数,使用一个变量func_obj
保存了test()
函数的引用(注意test
不要加()
,否则func_obj
保存的是test()
函数的返回值)
此时func_obj
保存了test()
函数的引用,即func_obj
指向了test()
函数的代码块在内存中的地址,此时对func_obj
进行调用,就是对func_obj
所指向的代码块进行调用
可以看到,调用func_obj()
后打印了“这是 test 函数的内部代码…”
id()
函数可以返回对象的唯一标识符,即对象的内存地址,使用id()
函数可以查看此时test()
函数和变量func_obj
的内存地址
def test():
print('这是 test 函数的内部代码...')
func_obj = test
func_obj()
print(id(test))
print(id(func_obj))
这是 test 函数的内部代码...
1420657021424
1420657021424
test()
函数和变量func_obj
指向同一个内存地址Python
)中,在函数中可以嵌套定义另一个函数,如果内部的函数引用了外部函数的变量,并且外部函数的返回值是内部函数的引用,此时被返回的内部函数引用称为闭包def test(num):
def wrapper():
print(num)
return wrapper
func_obj = test(0)
func_obj()
0
test()
函数的内部定义了wrapper()
函数,wrapper()
函数引用了外部函数test()
的变量num
,test()
将wrapper()
函数的引用作为返回值返回wrapper()
函数引用了test()
的变量num
,调用test(0)
时,test()
函数将wrapper()
函数的引用作为返回值返回的同时携带了变量num
的信息func_obj()
,打印了
0
0
0,此时运行了print(num)
即print(0)
def counter(cnt):
def add():
# nonlocal 关键字用于在内层函数中访问并修改外层函数作用域中的变量
nonlocal cnt
cnt += 1
return cnt
return add
# 创建一个闭包
func_obj = counter(1)
print(func_obj())
print(func_obj())
2
3
cnt
保存在内存中,闭包可以对cnt
进行修改