当前位置: 首页 > 面试题库 >

在Lambdas中捕获值而不是引用

羊舌勇
2023-03-14
问题内容

我对Eli Bendersky提供的示例感到有些惊讶(http://eli.thegreenplace.net/2015/the-scope-of-
index-variables-in-pythons-for-loops/

>>> def foo():
...     lst = []
...     for i in range(4):
...         lst.append(lambda: i)
...     print([f() for f in lst])
...
>>> foo()
[3, 3, 3, 3]

但是,当我想到它时,这是有道理的-Lambda捕获的是对i的引用,而不是i的价值。

因此,解决此问题的方法如下:

>>> def foo():
...     lst = []
...     for i in range(4):
...         lst.append((lambda a: lambda: a)(i))
...     print([f() for f in lst])
...
>>> foo()
[0, 1, 2, 3]

看来这样做的原因是,当将i提供给外部lambda时,外部lambda创建一个范围并取消引用i,将a设置为i。然后,返回的内部lambda保留对a的引用。

这是正确的解释吗?


问题答案:

默认参数是另一种获取值的方法:

lst.append(lambda i=i: i)


 类似资料:
  • 问题内容: 我想将预览层“流式传输”到我的服务器,但是,我只希望发送特定的帧。基本上,我想拍摄AVCaptureVideoPreviewLayer的快照,将其缩放到28 * 28,将其转换为强度数组,然后将其发送到我的python后端处理其余部分的套接字层。 这里的问题是AVCapturePhotoOutput的捕获功能异常缓慢。我不能重复调用该函数。更不用说它总是使相机的快门声哈哈。 另一个问题

  • 问题内容: 我的桌子如下 输出表如下 我的查询就像: 我无法编写查询;我将如何获得最小列名而不是最小值?我将如何完成田野? 问题答案: 您可以使用一个表达式来做到这一点:

  • 问题内容: 我有 我想按 位置 获得 职位, 而不是关键 职位 。 我不想使用迭代。 还有其他方法可以基于索引获取Value吗? 问题答案: 您无法获得基于索引的值,只是那样行不通。一种解决方法是根据您的值创建一个新列表,然后根据索引获取值。

  • 不存在从“lambda[]void(GLFWwindow*window,int key,int scancode,int action,int mods)->void”到glfwkeyfun“的适当转换函数 我是漏掉了什么还是这段代码只是无效?

  • 问题内容: 简而言之,我有一个带有ArrayList参数的方法。在该方法中,出于仅与该方法返回的内容相关的目的,我修改了ArrayList的内容。因此,我根本不希望作为参数传递的ArrayList受到影响(即,不作为引用传递)。 我尝试过的一切都未能达到预期的效果。我需要怎么做才能只使用方法内ArrayList的副本,而不能更改实际变量? 问题答案: 即使您有办法将数组列表作为副本而不是通过引用传

  • 我正在查看Java SE7的新功能,目前我正在: http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html 关于捕获多重功能,当我遇到这个语句时: 注意:如果一个捕捉块处理多个异常类型,那么捕捉参数是隐式最终的。在这个例子中,捕捉参数ex是最终的,因此您不能在捕捉块中给它赋值。 我从未注意到