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中的lambda表达式内的赋值

Python中的Lambda表达式

3.(补充)python中的lambda表达式的基本使用

python中的zipmapreduce lambda函数的使用。

python中的zipmapreduce lambda函数的使用

测码学院如何理解python中的lambda表达式并使用