求解释此python的lambda表达式

求教一下表达式各变量是怎么变化的,以及结果,尤其是n怎么变呢?fun=[(lambdan:i+n)foriinrange(10)]
四季花海
浏览 455回答 2
2回答

料青山看我应如是

这是python中为数不多的“怪事”之一fun=[(lambdan:i+n)foriinrange(10)]#等同于fun=[(lambdan:9+n)for_inrange(10)]因为lambda内的参数i在运行时才能确定,不是在声明时确定。最后fun保存了含有10个元素的数组,每一个元素都是lambda方法,该方法等于下面的lambda_item函数deflambda_item(n):return9+n如果整个表达式用python代码来诠释的话,可以是这样fun=[]foriinrange(10):fun.append((lambdan:9+n))另一个让新人迷惑的是a=[[0]]*3a[0].append(1)print(a)打印出[[0,1],[0,1],[0,1]]

慕无忌1623718

首先,感谢@李毅的回答,他回答的很好。1、初次执行那么,我们看看这个程序的运行结果是什么?fun=[(lambdan:i+n)foriinrange(10)]>>>fun[,,,,,,,,,]>>>len(fun)>>>10从运行的结果可以看出,fun参数是一个以函数对象为元素的列表,列表的长度为10。其中的长度是由步进函数range(10)来决定的。2、继续执行我们进行往下执行。>>>forfinfun:...f(1)...10101010101010101010结果出现了“意外”,并不是如想象中的那样,结果是相同的,没有步进。3、修改步进函数的值>>>fun=[(lambdan:i+n)foriinrange(2)]>>>fun[,]>>>fun=[(lambdan:i+n)foriinrange(3)]>>>fun[,,]>>>从上面的执行结果,我们可以明显的看出,步进函数决定了list的长度,但是这个list比较特别的地方是列表的元素是function对象,而对于function来说,就涉及到参数的作用域问题,而function对象里的i参数,明显是一个全局变量,@Jasoney说的很好,这个i参数随着步进函数range(10)的迭代,不断变化,最终确定值为9,那么function对象最终可以确定为lambadn:9+n,所以,最终的执行结果虽然“奇怪”,但也合乎逻辑。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript