专业郑州网站建设,桂林网站建设招聘,青岛网站建设方案,临淄信息港无意间#xff0c;看到这么一道Python面试题#xff1a;以下代码将输出什么#xff1f; def testFun(): temp [lambda x : i*x for i in range(4)] return temp
for everyLambda in testFun(): print (everyLambda(2))脑中默默一想#xff0c;这还用说么#xff0c;肯定是…无意间看到这么一道Python面试题以下代码将输出什么 def testFun(): temp [lambda x : i*x for i in range(4)] return temp
for everyLambda in testFun(): print (everyLambda(2))脑中默默一想这还用说么肯定是 0 2 4 6最后一看答案竟然是 6 6 6 6于是带着怀疑的心态其实是不服输不认错打开编辑器快速一敲果然是。 怀疑了人生半天本来还想黑WTF Python…然后才想通是自己太生疏…… 最后发现原因竟是Python 的闭包的后期绑定导致的 late binding这意味着在闭包中的变量是在内部函数被调用的时候被查找。 所以结果是当任何 testFun() 返回的函数被调用在那时i 的值是在它被调用时的周围作用域中查找到那时无论哪个返回的函数被调用for 循环都已经完成了i 最后的值是 3因此每个返回的函数 testFun 的值都是 3。因此一个等于 2 的值被传递进以上代码它们将返回一个值 6 比如 3 x 2。 究竟如何才能实现出这样的结果呢 想了想若能立即绑定参数或者直接不用闭包总该行吧用另一种方式避免 i 的改写。 回忆了之前所学知识最后酝酿出了四种解决方案 第一种创建一个闭包通过使用默认参数立即绑定它的参数 第二种使用functools.partial 函数把函数的某些参数不管有没有默认值给固定住也就是相当于设置默认值 第三种优雅的写法直接用生成器 第四种利用yield的惰性求值的思想 有了解决方案后又陷入了怀疑自己这个题目究竟是考察的是什么是在考面试者闭包相关知识以及Python 的闭包的后期绑定问题么 若将题目改成以下代码输出的结果是0,2,4,6么如果不是你将会怎么做让它变成0,2,4,6这样会不会更有意思点呢欢迎大家出妙招看究竟有多少招哈哈哈 本文作者简介一个痴迷于Python语言的业余程序猿经过半年苦练经历过从入门到放弃现在庆幸走到痴迷于Python状态。未来的理想是能够与一群痴迷于Python语言的程序猿做有意义的事。 作者燕大侠v链接 https://www.jianshu.com/p/7e8a16321334 -END- 识别图中二维码,领取python全套视频资料转载于:https://www.cnblogs.com/IT-Scavenger/p/9878698.html