'''
作用域
闭包中肯定会涉及到作用域的问题
Ctrl+alt+l 格式化
'''
b =4deff(a):# global b = 9 语法错误global b
print(a)print(b)# b = 9 这样会报错 python在编译函数的定义体时,判断b为局部变量#使用global就能完美解决问题
b =9
f(1)print(b)
'''
闭包
自由变量
假如在全局中定义了变量a,在函数中使用了这个a,这个a就是自由变量,可以这样理解,凡是跨了自己的作用域的变量都叫自由变量。
def sum(*args, **kwargs): # real signature unknown
"""
Return the sum of a 'start' value (default: 0) plus an iterable of numbers
When the iterable is empty, return the start value.
This function is intended specifically for use with numeric values and may
reject non-numeric types.
"""
pass
'''defmake_average():
series =[]#初始化一个空列表 series是自由变量defaverager(val):
series.append(val)
total =sum(series)#sum() 累加return total /len(series)return averager #返回一个函数名
avg = make_average()#相当于avg = averagerprint(avg(10))#10.0print(avg(11))#10.5print(avg(12))#11.0print(avg.__code__.co_varnames)#局部变量 ('val', 'total')print(avg.__code__.co_freevars)#自由变量 ('series',)print(avg.__closure__)#cell对象 (<cell at 0x000001554614FCD0: list object at 0x00000155460F30C0>,)print(avg.__closure__[0].cell_contents)#自由变量的值,即series的值 [10, 11, 12]
'''
nonlocal
nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。
'''defmake_averager():
count =0
total =0defaverager(val):nonlocal count, total #如果没有这行代码会报错
count +=1#相当于count = count + 1,相当于在创建了一个局部变量
total += val
return total / count
return averager
avg = make_averager()#相当于avg = averagerprint(avg(10))#10.0print(avg(11))#10.5print(avg(12))#11.0