python - 笨拙的 lambda 函数

标签 python

我无法找出 key=key 在这个简单的 python 代码中做了什么:

for key in dict:
    f = (lambda key=key: print(key))
    print(f())

最佳答案

这段代码中,key=key 没有任何用处。您也可以将循环编写为

for key in [1,2,3]:
    f = lambda: key
    print(f())

这将打印123。 (请注意——与问题无关——我还从 lambda 中删除了 print,而不是直接返回值,因为它是多余的,只会使“外部"print 打印 None,因为这是函数将返回的内容 print。)

但是,如果您不是在循环内执行函数,而是在循环之后执行怎么办?

functions = []
for key in [1,2,3]:
    f = lambda: key
    functions.append(f)

for f in functions:
    print(f())

现在,这将打印 333,因为 key 变量在该函数被调用,而不是在它被定义时被调用,即在循环之后它的值为3。这可能会导致一些严重的意外,例如什么时候defining callback functions for different buttons in a loop .

在这里,使用 key=key 开始发挥作用:这将创建一个参数 key 并为其分配 key 的当前值定义函数时循环中的变量作为默认值(因此调用函数时不必传递参数)。稍后调用函数时,key 参数的值将在函数范围内保持不变:

functions = []
for key in [1,2,3]:
    f = lambda key=key: key
    functions.append(f)

这会像预期的那样打印 123。正如其他人所指出的,您可以为参数使用不同的名称,以减少混淆,例如f = lambda param=key: param

关于python - 笨拙的 lambda 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40061106/

相关文章:

python - 使用多处理读取、压缩、写入

python - 将函数映射和参数存储在字典中

python - 如何使用 Python 和 OpenCV 实现良好的边缘检测来校准一些非常小的东西

python - 二进制搜索 : weird middle point calculation

python 3 : Solving arrayChange in CodeFights

python - Eclipse 编辑器无法识别 Scipy 内容

python - 无法easy_install ssl模块

python - PyOpenGL Texture_3D 和 Numpy 不渲染

python - 如何使用 Python 连接多个 netCDF 文件中的数据

Python 3.1.3 Win 7 : csv writerow Error "must be bytes or buffer, not str"