繁体   English   中英

python:关于lambda和关闭

[英]python: about lambda and closure

我明白那个:

a=[lambda :k for k in [1,2,3]]
[e() for e in a]

返回[3, 3, 3]因为它在运行时获取k的值,并且k的最后一个值是3 但是,我不明白为什么,如果我这样做:

k=50
[e() for e in a]

我仍然得到[3, 3, 3] 为什么这个? 我用50更新了k的值,为什么e()函数仍然读取旧的k值?

虽然你刚才说很清楚

a=[lambda :k for k in [1,2,3]]
[e() for e in a]

返回[3,3,3] ,这需要几句话。 当然,这对每个人来说都不是很清楚。 第一个列表推导创建了三个函数。 它们都没有 arguments 并且它们都返回变量 k。 在列表理解中 k 不是数字。 K 是一个变量。 你的三个函数返回那个变量。 所以你有三个相同的功能。 通常 k 变量会丢失。 它仅适用于列表理解。 您无法在列表理解之外再访问它。 但是在您的特殊情况下, k 仍然存在。 它仍然在三个函数中被捕获,因为它们返回它。 这就是所谓的(k 的)闭包。 由于 k 用于在最后遍历列表[1,2,3] ,它仍然是 3。所以所有三个函数都返回 3。但这并不那么明显。 Python 也可以将其再次设置为零或随机数。 没有这样的说法,即 k 保持在最后一个值。 因此,即使您的代码返回 [3, 3, 3],这也不明显,也无法保证。

如前所述, k 在列表理解之外不再可访问。 它仅在列表理解的 scope 中。 只有使用三个 a 函数,您才能访问该 k。 另一方面,你不能告诉 a 函数使用另一个 k。 列表理解中的 k 在它们的闭包中。 k=50有一个完全不同的 scope。

如果您想要 a 函数中的其他 k,则必须以这种方式定义它们:

a=[lambda k : k_compr for k_kompr in [1,2,3]]
[e() for e in a]

并将 k 传递给他们。 但我认为你的问题只是提供信息。 没有人会使用这样的列表理解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM