1、内部函数
def func():
# 声明变量
n = 100
list1 = [1,2,3,4]
#声明内部函数
def inner_fnc():
#对列表list1里面的元素进行加5操作
for index,i in enumerate(list1):
nonlocal n
n = 99
list1[index] = i+ 5
list1.sort()
inner_fnc()
print(list1)
print(n)
func()
#输出结果为:
[6, 7, 8, 9]
99
-
内部函数可以访问外部函数变量,如果内部函数要修改外部函数的变量时,需要注意以下几点:
- 当外部函数变量为不可改变的类型时,内部函数需要修改需要加nonlocal关键字声明。
- 当外部函数变量为可变类型时,内部函数可以调用,不需要加任何关键字。
- 可变类型与不可变类型可以参考:Python中可变与不可变类型
-
查看局部变量和全局变量
- 使用locals()系统函数可以查看当前函数中声明的内容有哪些,并以字典形式输出。
- 使用globals()系统函数可以查看全局变量有哪些,以字典形式输出。(里面会有系统的键值对)
2、闭包
-
闭包符合的条件:
- 外部函数中定义了内部函数。
- 外部函数是有返回值的。
- 返回值是:内部函数名
- 内部函数引用了外部函数的变量(严格定义)
#示例: def func(): a = 200 def inner_func(): b = 99 print(a,b) return inner_func x = func() x() #输出结果为: 200 99
-
闭包的作用
- 可以使用同级的作用域
- 读取其他元素的内部变量
- 延长作用域
-
闭包的应用:计数器(能够返回闭包时的状态)
def generate_count(): cotainer = [0] def add_one(): cotainer[0] = cotainer[0] + 1 print('当前是第{}次访问'.format(cotainer[0])) return add_one counter = generate_count() counter() counter() #输出结果为: 当前是第1次访问 当前是第2次访问
-
闭包的缺点
- 作用域没有那么直观。
- 变量不会被垃圾回收,有一定的内存占用问题。