python中的lambda表达式引起的问题? [复制]
Posted
技术标签:
【中文标题】python中的lambda表达式引起的问题? [复制]【英文标题】:Question caused by lambda expression in python? [duplicate] 【发布时间】:2022-01-16 02:27:24 【问题描述】:我写了一个类似的 Python 代码:
fun_list = []
for i in range(10):
fun_list.append(lambda : f(i))
for j in range(10):
fun_list[j]()
我希望它输出 0 到 9 之间的数字,但实际上它输出了 10 次 9!
我认为问题是变量被传输到函数 f 只有它被调用。一旦被调用,它将全局查找名为“i”的变量。
如何修改代码以输出0到9的数字?
【问题讨论】:
为什么要使用lambda
?只是fun_list.append(i)
可以输出0到9。
这是由于 lambda 的后期绑定。我敢肯定 SO 上有骗子。
【参考方案1】:
您的代码没有意义fun_list[j]()
您如何调用列表元素?
如果您想将上述数字附加到您的数组中,那么正确的代码是:-
fun_list = []
for i in range(10): ### the range has to be from 0 to 10 that is [0,10)
fun_list.append(i) ### You dont need lambda function to append i
如果不需要的话,这也是做什么的,因为你首先还没有初始化什么是 f?... 它是一个函数吗?您在这里不是附加值,而是附加被调用的函数语句。你不需要那个。只需像上面那样简单地做......:-
fun_list.append(lambda : f(i))
【讨论】:
感谢您的回答!我的第一个问题是我需要使用 schedule 模块来实现警报。警报配置是在 json 文件中读取的,并且警报内容和警报时间很多,因此我使用 for 循环将它们添加到计划中。我添加了第一个代码!谢谢!【参考方案2】:因为 lambda 函数在每次迭代中都被重新定义,所以它给你 9s,因为这就是 lambda 函数现在在第二次迭代时的样子。
例如,
fun_list = []
for i in range(10):
fun_list.append(lambda : f(i))
f = lambda i: 100
for j in range(10):
print(fun_list[j]())
上面的代码打印出 100,100,100,100,... 因为这是 lambda 函数在第二次迭代时现在的样子。
所以如果要保存 0-9,则必须为每个整数调用 lambda 函数:
fun_list = []
for i in range(10):
fun_list.append((lambda: i)())
for j in range(10):
print(fun_list[j])
输出:
0
1
2
3
4
5
6
7
8
9
但是要得到这个结果,你可以简单地做
fun_list = [i for i in range(10)]
【讨论】:
以上是关于python中的lambda表达式引起的问题? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
python中的zipmapreduce lambda函数的使用。