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

料青山看我应如是
TA贡献1772条经验 获得超8个赞
这是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
TA贡献1744条经验 获得超4个赞
首先,感谢@李毅的回答,他回答的很好。1、初次执行那么,我们看看这个程序的运行结果是什么?fun=[(lambdan:i+n)foriinrange(10)]>>>fun[at0x7f032e425668>, at0x7f032e4256e0>, at0x7f032e425758>, at0x7f032e4257d0>, at0x7f032e425848>, at0x7f032e4258c0>, at0x7f032e425938>, at0x7f032e4259b0>, at0x7f032e425a28>, at0x7f032e425aa0>] >>>len(fun)>>>10从运行的结果可以看出,fun参数是一个以函数对象为元素的列表,列表的长度为10。其中的长度是由步进函数range(10)来决定的。2、继续执行我们进行往下执行。>>>forfinfun:...f(1)...10101010101010101010结果出现了“意外”,并不是如想象中的那样,结果是相同的,没有步进。3、修改步进函数的值>>>fun=[(lambdan:i+n)foriinrange(2)]>>>fun[at0x7f032e42e050>, at0x7f032e42e140>] >>>fun=[(lambdan:i+n)foriinrange(3)]>>>fun[at0x7f032e425668>, at0x7f032e4256e0>, at0x7f032e425758>] >>>从上面的执行结果,我们可以明显的看出,步进函数决定了list的长度,但是这个list比较特别的地方是列表的元素是function对象,而对于function来说,就涉及到参数的作用域问题,而function对象里的i参数,明显是一个全局变量,@Jasoney说的很好,这个i参数随着步进函数range(10)的迭代,不断变化,最终确定值为9,那么function对象最终可以确定为lambadn:9+n,所以,最终的执行结果虽然“奇怪”,但也合乎逻辑。
没有找到匹配的内容?试试慕课网站内搜索吧
添加回答
举报
0/150
提交
取消