一、内部函数
- 可以访问外部函数的变量
- 内部函数可以修改外部函数的可变类型的变量
def func():
# 声明变量
n = 100 # 局部
list1 = [3,7,2,4] # 局部
# 声明内部函数
def inner_func():
nonlocal n
# 对list1的元素进行加5操作
for index,i in enumerate(list1):
# 0 3
list1[index] = i+n
list1.sort()
# 修改n
n += 101
# 调用内部函数
inner_func()
print('打印老大:',n)
print('打印老二:',list1)
# 调用func
func()
- 内部函数修改全局的不可变变量时,需要在内部函数声明:global 变量名
- 内部函数修改外部函数的不可变变量时,需要在内部函数声明:nonlocal 变量名
- locals():查看本地变量有哪些,以字典形式输出
- globals():查看全局变量有哪些,以字典形式输出(里面有一些系统的键值对)
a = 100 # 全局变量
# 定义函数
def func():
# 声明变量
b = 99
# 声明函数
def inner_func():
global a
nonlocal b
c = 88
# 尝试修改
c += 12
b += 1
a += 10
# 尝试打印
print(a,b,c)
# 调用内部函数
inner_func()
# 用locals内置函数进行查看,可以看到在当前函数中声明的内容
print(locals())
# 调用函数
func()
二、闭包
1、条件:
定义:在一个内部函数中,对外部作用域的变量进行引用,(并且一般外部函数的返回值为内部函数),那么内部函数就被认为是闭包定义。
- 外部函数中定义了内部函数
- 外部函数有返回值,返回值是:内部函数名
- 内部函数引用外部函数的变量
2、格式:
def 外部函数():
...
def 内部函数():
...
return 内部函数
def func():
a = 100
def inner_func():
b = 99
print(a,b)
return inner_func
x = func()
print(x) # <function func.<locals>.inner_fun