当前位置: 首页 > 后端技术 > Python

列表理解和lambda函数结合的原理

时间:2023-03-26 15:38:58 Python

今天的文章来源于一个python试题:我参考了网上的解释,不是很清楚。下面来解释一波list1=[lambdax:x+iforitodayinrange(10)]forlist2inlist1:print(list2(5))执行结果:14141414141414141414不是我们预期的结果,那么a这时我的脑海里出现了一首歌:孩子,你有很多问号吗?按照我们的推测,不应该是5、6、7、8、9、10、11、12、13、14这样的答案吗?所以这道题看似简单,其实里面包含了很多代码结构。这个时候,我们就需要拆分这个语句。我们都知道一个lambda函数可以写成:deffun1(x):returnx+i那么,我们的列表推导式怎么拆写呢?其实我们也定义了一个函数来完成列表数据的添加。lst=[]deffun():foriinrange(10):lst.append(i)returnlst那么这个完整的语句是如何重写的呢?lst=[]deffun():foriinrange(10):deffun1(x):returnx+ilst.append(fun1)returnlstr=fun()print(r)执行结果:[.fun1at0x0000014FA44BEF28>,.fun1at0x0000014FA44C30D0>,.fun1at0x0000014FA44C31E0>,.fun10at032C31E0>,.fun10032C304,FA10functionfun..fun1at0x0000014FA44C32F0>,.fun1at0x0000014FA44C3378>,.fun1at0x0000014FA44C3400>,.fun140>4,.fun1at0x0000014FA44C3510>,.fun1at0x0000014FA44C3598>]你熟悉这个结构吗?是的,它是一个闭包函数,返回的结果是一个列表中存储的fun1的函数对象。那么问题来了,既然是函数对象,那不应该是我们调用函数并给它传递参数时的预期结果吗?为什么结果都是14?这就涉及到python的闭包函数的特点:内部函数没有特殊方法是不能修改外部函数的变量的。我们这里使用的是外部函数的变量i,所以当我们的for循环执行了十次后,我们列表中生成的每个函数对象都使用了变量i,并且都指向了外部函数中变量的内存地址i,那么当最后一个循环执行的时候,我们的i是不是变成了9,所以每个函数对象中的变量i的值都变成了9,至此,当我们做for循环的时候,遍历这个链表,传递x=的值5,就变成了5+9=14的结果。其他lambda函数结合列表推导也有同样的逻辑,你学会了吗?