神奇的括号

无意间,看到这么一道Python面试题:以下代码将输出什么?

def a():

    return[lambda x : i*x for i in range(4)]

for c in a():

    print (c(2))

这尼玛还用看,一个lambda匿名函数,一个for循环,这还用说么,肯定是:0,2,4,6,

然而,现实是残酷的,打开pycharm,对着敲了一次,结果被赤裸裸的打脸.

可以看到,输出的竟然是6,6,6,6.尼玛,什么鬼,pycharm脑抽了,重新运行,然而依然6666,好吧,算我输咯,问度娘,万能的度娘说:这个的原因是 Python 的闭包的后期绑定导致的 late binding,这意味着在闭包中的变量是在内部函数被调用的时候被查找。所以结果是,当任何 multipliers() 返回的函数被调用,在那时,i 的值是在它被调用时的周围作用域中查找,到那时,无论哪个返回的函数被调用,for 循环都已经完成了,i 最后的值是 3,因此,每个返回的函数 multiplies 的值都是 3。因此一个等于 2 的值被传递进以上代码,它们将返回一个值 6 (比如: 3 x 2)...

好吧,那我就认了,6666呗,但是发现

def a():

   return(lambda x : i*x for i in range(4))

for c in a():

print (c(2))

返回的是啥???

事实告诉我这尼玛是正宗的0246啊,等等,代码没变啊...

突然发现变成生成器了,神奇得一比,这也许就就是一对括号引发的血案.

还有要输出0246可以咋办,有老司机说绑定参数,通过使用默认参数立即绑定它的参数.

然后在想改变这个括号,是否会有神奇得事情发生

然而并没有...

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容