page contents

80%面试者不知道的陷阱:闭包中延迟绑定

这是一个很有迷惑性的陷阱,大部分人都会掉进去,这就是Python在闭包作用域中绑定变量的方式。 我们有一个函数是squares(用来创建平方数的函数),里面有一个3个匿名函数,每个匿名函数是返回...

这是一个很有迷惑性的陷阱,大部分人都会掉进去,这就是Python在闭包作用域中绑定变量的方式。

v2-34913b4beb6dc38e908fcd2cd7d4b2cb_hd.jpg

我们有一个函数是squares(用来创建平方数的函数),里面有一个3个匿名函数,每个匿名函数是返回i的平方数.看起来好像也满简单的,返回平方数嘛。

接着我们用一个for循环得到每一个square函数,然后给这个square输入一个2, 也就是说x为2。我们期望的结果是: 0,1,2

0*2=01*2=22*2=4

但是实际上的结果是:

444

为啥会这样的呢,闭包本来就是Python里面一个比较难理解的概念,经常和函数装饰器搞在一起,再加上一个匿名函数,头都昏了!我们来换一下普通函数方式来理解:

v2-40dbe13306d83c8ac117c0bb4e5780d7_hd.jpg

Python的闭包是延迟绑定,也就是说闭包中用到的变量的值,是在内部函数被调用的时候才查询得到的。

res里面包含了闭包函数make_square,这个闭包比较牛逼,它会对延伸到函数的作用域外边,也就是包含了对变量i的绑定,最后一次查询i的值为2.

正确的做法:

v2-7762665e4110bbaf2d1d075549f4e8e4_hd.jpg

i因为闭包延迟绑定才会造成上面的问题,解决的办法就是给它立刻绑定,就搞定了。


更多技术资讯,请继续关注六星教育社区-程序员编程技术分享交流学习高端论坛。

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1312 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章