gpt4 book ai didi

python - lambda 函数闭包捕获什么?

转载 作者:行者123 更新时间:2023-12-03 20:38:35 25 4
gpt4 key购买 nike

最近我开始玩 Python,我发现了闭包工作方式的一些奇特之处。考虑以下代码:

adders=[None, None, None, None]

for i in [0,1,2,3]:
adders[i]=lambda a: i+a

print adders[1](3)
它构建了一个简单的函数数组,这些函数接受单个输入并返回该输入加上一个数字。函数在 for 中构建循环所在的迭代器 i来自 03 .对于这些数字中的每一个, lambda创建捕获 i 的函数并将其添加到函数的输入中。最后一行调用第二个 lambda功能与 3作为参数。令我惊讶的是输出是 6 .
我期待一个 4 .我的推理是:在 Python 中,一切都是对象,因此每个变量都是指向它的指针。创建 lambdai 的闭包,我希望它存储一个指向当前指向的整数对象的指针 i .这意味着当 i分配了一个新的整数对象,它不应该影响之前创建的闭包。可悲的是,正在检查 adders调试器中的数组显示它确实如此。全部 lambda函数引用 i 的最后一个值, 3 ,结果是 adders[1](3)返回 6 .
这让我想知道以下几点:
  • 闭包准确捕获了什么?
  • 说服lambda最优雅的方式是什么?函数来捕获 i 的当前值以不受影响的方式 i改变它的值(value)?
  • 最佳答案

    您可以使用具有默认值的参数强制捕获变量:

    >>> for i in [0,1,2,3]:
    ... adders[i]=lambda a,i=i: i+a # note the dummy parameter with a default value
    ...
    >>> print( adders[1](3) )
    4

    这个想法是声明一个参数(巧妙地命名为 i )并给它一个你想要捕获的变量的默认值(值 i )

    关于python - lambda 函数闭包捕获什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67934912/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com