Python剖析-老男孩经典面试题目---闭包

题目:分析代码结果

def num():
    return [lambda x:i*x for i in range(4)]
print([m(2)for m in num()])
代码输出是[6,6,6,6]

此题目涉及闭包问题,首先来了解一下什么是闭包:

闭包是嵌套在函数中的函数
闭包必修是内层函数对外层函数的变量(非全局变量)的引用

像下面的实例一样 a就是闭包

def wrapper():
    a = 1
    def inner():
        print(a)
    return inner
ret = wrapper()

闭包有什么作用呢?

1.保存局部信息不被销毁,保证数据的安全性。
2.装饰器的本质

如何区分闭包?

print(XXX.__code__.co_freevars) 

那么回到原理的题目 可以把匿名函数转回普通形式的函数:

def num():
    dic = []
    for i in range(4):   #值得注意 这里的i 并不是0123 而是3
        def num2(x):
            return x * i
        dic.append(num2)
    return dic

因位内层嵌套函数的变量i 是在for 循环外层函数的for循环中的i 执行完才引用的,这是一个闭包的概念

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值