如何使用列表理解生成不同 lambda 函数的列表?

2023-12-15

这个问题是从涉及 Tkinter 按钮回调函数的原始应用程序中提炼出来的。这是说明该行为的一行。

lambdas = [lambda: i for i in range(3)]

如果您随后尝试调用生成的 lambda 函数:lambdas[0](), lambdas[1]() and lambdas[2]()全部返回2。

期望的行为是lambdas[0]()返回0,lambdas[1]()返回1,lambdas[2])()返回 2.

我看到索引变量是通过引用解释的。问题是如何重新表述以按价值对待它。


使用具有默认值的参数来绑定当前值 of i到局部变量。当。。。的时候lambda被调用时不带参数,局部变量i被赋予默认值:

In [110]: lambdas = [lambda i=i: i for i in range(3)]

In [111]: for lam in lambdas:
   .....:       print(lam())
   .....: 
0
1
2

When i不是局部变量,Python在封闭范围内查找其值。找到的值是最后一个值i在列表理解的 for 循环中获得。这就是为什么,如果没有默认值的参数,每个lambda返回 2,因为在调用 lambda 时 for 循环已完成。


解决这个问题的另一种常见方法是使用闭包——可以引用不再活动的环境的函数 例如外部函数的本地命名空间,即使该函数返回后也是如此.

def make_func(i):
    return lambda: i

lambdas = [make_func(i) for i in range(3)]
for lam in lambdas:
    print(lam())

prints

0
1
2

这是有效的,因为当lam()被调用,因为i in the lambda函数体不是局部变量,Python 查找的值i在 函数的封闭范围make_func。它的本地命名空间仍然是 可接近封闭,lam, 虽然make_func已经 完全的。该本地命名空间中的值是传递给的值make_func,幸运的是,这是期望的值i.


As mkrieger1 已经提到过, 使用已提供的一些参数值创建新函数的另一种方法 是使用functools.partial:

lambdas = [functools.partial(lambda x: x, i) for i in range(3)]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用列表理解生成不同 lambda 函数的列表? 的相关文章

随机推荐

  • 使用 make 文件创建目录

    我想使用 makefile 创建目录 我的项目目录是这样的 Project output source Testfile cpp Makefile 我想将所有对象和输出放入相应的输出文件夹中 我想创建编译后像这样的文件夹结构 Project
  • 在 Knit 中调整观星台的大小

    我使用 knit 整理了一份文档 虽然该文档的大部分看起来都不错 但有一个回归表太宽 如果不进行一些更改 就无法容纳在页面上 回归表是使用 stargazer 生成的 并且相当广泛 我尝试按如下方式调整整个块的大小 r echo FALSE
  • 无法连接到 Localdb,但可以使用命名管道

    我真的很讨厌将我的应用程序连接到数据库 我正在尝试使用连接到数据库 localdb MSSQLLocalDB在连接字符串中 我收到此错误 A network related or instance specific error occurr
  • web-api POST body 对象始终为 null

    我仍在学习 Web API 所以如果我的问题听起来很愚蠢 请原谅我 我的里面有这个StudentController public HttpResponseMessage PostStudent FromBody Models Studen
  • 使用 VBA 创建 Outlook 事件(不是约会!)

    所以有一个线程所以链接在这里它链接了如何创建 Outlook 事件 但实际上它创建的是约会 而不是事件 差异可以阅读HERE 我的问题很简单 如何使用 VBA 创建实际事件而不是约会 谢谢 约会和事件之间的区别是事件持续 24 小时或更长时
  • Zend 表单引导注释日期选择器“提供给转义助手的对象,但标志不允许递归”

    我正在使用带有 Bootstrap 和 ReverseForm 适配器的 Zend 框架 并且有一个有趣的问题 当我在 Zend Form 中使用 Bootstrap Datepicker 时 出现下一个异常 Object provided
  • 将位图转换为 ninepatch 以用作背景

    我有一个问题困扰了我好几天了 我正在尝试将九个补丁图像转换为位图数组 并将特定颜色更改为不同的颜色 我无法将位图转换回九个补丁 因此我可以将其用作布局的背景 我尝试使用此代码创建位图 然后将其转换回九个补丁可绘制对象 但它只是启动活动并闪烁
  • asp 服务器错误“无法加载文件或程序集”,但程序集肯定存在。

    我目前收到以下错误 在 locahost 网站上 Could not load file or assembly MySql Data Version 6 5 4 0 Culture neutral PublicKeyToken c5687
  • android中Videoview的身份验证

    我正在使用一个视频观看播放http视频 Http视频url需要验证 所以请让我知道如何为 VideoView 设置身份验证 如果没有 是否还有其他替代方法来查看经过身份验证的视频 感谢和问候 斯里 哈沙 VideoView 中有一个隐藏方法
  • 如何设置 ASP.NET 身份验证属性

    我的 web config 文件中有以下设置 如果用户未登录 它基本上会限制对页面的访问 如果我不想使用 asp 登录控件或实现会员资格提供程序 我如何 告诉 asp loginregister aspx 页面已授权该请求如果我想实现自己的
  • Android 片段中的手电筒 - SurfaceView

    我正在尝试为当地音乐会开发手电筒应用程序 这是一个更大的应用程序的一部分 因此它位于一个片段中 这是代码 首先 我声明了该类及其变量 public class ConcertFragment extends Fragment ToggleB
  • 在 VBA 中解析 XML

    我有一个 XMLResponseXML目的 我想循环遍历所有名为 XYZ 的节点 我该怎么做呢 以下是您可以使用的一些功能parsing your XML Private xml As MSXML DOMDocument Private S
  • 读入R中路径中包含UTF-8字符的文件

    假设我有大量 rds 文件 其中一些文件的路径中包含 UTF 8 字符 由于某种原因 R 无法处理一些特殊的重音 例如enc2utf8 它应该打印 但在我最后它转换为 C 这使得 R 无法识别该文件 有什么想法如何处理这种情况 帮助 R 进
  • 从c中的另一个文件链接静态函数

    我有两个源文件 A c 和 B c A c 有一个函数 call me static int call me void call me register register call me call me 正如你所看到的 call me函数被
  • 从 UWP 应用程序中提取图标

    在尝试实现 打开方式 功能时 我遇到了从 UWP 应用程序提取图标的问题 因此 在收到推荐的应用程序列表后 借助以下命令打开特定文件SHAssocEnumHandlers 我试图在以下命令的帮助下提取每个应用程序的图标IAssocHandl
  • Windows 上 Boost.Python 1.54(调试版本)对 Python27.lib 的令人困惑的依赖关系

    我一定犯了某种明显的错误 但经过几个小时的战斗 我无法取得进一步的进展 升级到 Boost 1 54 CMake 2 8 12 和 Python 2 7 5 所有三个均来自slightly早期的次要版本 我的 Python 绑定projec
  • 如何获取 Pandas 数据框中所有非 NaN 项的行、列索引

    如何迭代如下所示的数据帧并将非 NaN 值位置作为元组返回 IE df 0 1 2 0 NaN NaN 1 1 1 NaN NaN 2 NaN 2 NaN 我会得到 0 1 2 0 1 2 的输出 最好的方法是执行嵌套 for 循环吗 或者
  • C++中M个盒子中N个球的组合列表

    我想编写一个函数 生成一个元组数组 其中包含 C 中 M 个盒子中 N 个球的所有可能排列 顺序 编辑 在结果列表中 并不重要 只是第一个必须是 N 0 0 和最后一个 0 0 N 我在网上没有找到这样的C 实现 只有字符的排列或排列数量的
  • 如何在 matplotlib 中使用交互式事件编辑表格数据

    在图中创建了一个表格 现在我想在双击单元格后编辑表格 添加 删除或修改该单元格中的数据 就像Excel中的编辑功能一样 我的python版本是3 64 代码如下 import matplotlib pyplot as plt import
  • 如何使用列表理解生成不同 lambda 函数的列表?

    这个问题是从涉及 Tkinter 按钮回调函数的原始应用程序中提炼出来的 这是说明该行为的一行 lambdas lambda i for i in range 3 如果您随后尝试调用生成的 lambda 函数 lambdas 0 lambd