无意间,看到这么一道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可以咋办,有老司机说绑定参数,通过使用默认参数立即绑定它的参数.
然后在想改变这个括号,是否会有神奇得事情发生
然而并没有...