Python闭包

闭包

# 封闭的东西 : 保证数据的安全

l1 = []
li = [] # 这时候如果我添加一个全局变量li = [],
def make_averager(new_value):
    l1.append(new_value)
    total = sum(l1)
    averager = total/len(l1)
    return averager
print(make_averager(100000))
print(make_averager(110000))
l1.append(666)  # 这里其实我想改变的li,却操作错了l1 这意味着l1在全局中并不安全
print(make_averager(120000))
print(make_averager(90000))



# 方案二: l1放进方法中 数据安全, 但是l1不是全局变量
# 每次执行的时候, l1列表都会重新赋值成[]空列表

def make_averager(new_value):
    l1 = []
    l1.append(new_value)
    total = sum(l1)
    averager = total/len(l1)
    return averager
print(make_averager(100000))
print(make_averager(110000))
l1.append(666)  # 这里其实我想改变的li,却操作错了l1 这意味着l1在全局中并不安全
print(make_averager(120000))
print(make_averager(90000))


# 方案三:
def make_averager():
    l1 = []
    def averager(new_value):
        l1.append(new_value)
        total = sum(l1)
        return  total/len(l1)
    return averager

avg = make_averager()  # 调用函数make_averager() 赋值给avg
print(avg(100000))   # 调用avg加(参数) 调用内置函数 每次生成一个l1都返回并保存,原来的l1删除
 

image-20200528143055940

只要闭包中使用到了自由变量, 那么这个自由变量就会一直存在
# 闭包:
# 1.闭包只能存在嵌套的函数中
# 2.内层函数对外层函数非全局变量的引用(使用)
# 特点: 被引用的非全局变量也称作自由变量, 这个自由变量会与内存函数产生一个绑定关系,自由变量不会在内存中消失.
# 作用: 保证数据安全


判断代码的闭包:
avg = make_averager()
print(avg.__code__.co_freevars)

(venv) C:\work\python>python 04bibao.py
('l1',)  # 获取了一个元组

posted on 2020-06-10 22:06  sunnywillow  阅读(70)  评论(0)    收藏  举报