这是一个很有迷惑性的陷阱,大部分人都会掉进去,这就是Python在闭包作用域中绑定变量的方式。
我们有一个函数是squares(用来创建平方数的函数),里面有一个3个匿名函数,每个匿名函数是返回i的平方数.看起来好像也满简单的,返回平方数嘛。
接着我们用一个for循环得到每一个square函数,然后给这个square输入一个2, 也就是说x为2。我们期望的结果是: 0,1,2
0*2=01*2=22*2=4
但是实际上的结果是:
444
为啥会这样的呢,闭包本来就是Python里面一个比较难理解的概念,经常和函数装饰器搞在一起,再加上一个匿名函数,头都昏了!我们来换一下普通函数方式来理解:
Python的闭包是延迟绑定,也就是说闭包中用到的变量的值,是在内部函数被调用的时候才查询得到的。
res里面包含了闭包函数make_square,这个闭包比较牛逼,它会对延伸到函数的作用域外边,也就是包含了对变量i的绑定,最后一次查询i的值为2.
正确的做法:
i因为闭包延迟绑定才会造成上面的问题,解决的办法就是给它立刻绑定,就搞定了。
更多技术资讯,请继续关注六星教育社区-程序员编程技术分享交流学习高端论坛。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!