【问题标题】:How can I return a function that uses the value of a variable? [duplicate]如何返回使用变量值的函数? [复制]
【发布时间】:2017-06-19 14:11:38
【问题描述】:

我想编写一个返回函数列表的函数。作为 MWE,这是我对函数的尝试,它提供了三个函数,将 0、1 和 2 添加到输入数字:

def foo():
    result = []
    for i in range(3):
        temp = lambda x: x + i
        print(temp(42))  # prints 42, 43, 44
        result.append(temp)
    return result

for f in foo():
    print(f(42))  #prints 44, 44, 44

与我的预期相反,每个函数最终都使用 i 所取的最后一个值。例如,我经历过类似的行为。列表用作函数的参数,但 Python 实际上使用指向列表的指针,但这里 i 是一个整数,所以我不明白这里发生了什么。我正在运行 Python 3.5。

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    闭包晚绑定,这意味着它们将在调用时使用它们已定义的范围内的最后一个值i(在这种情况下,i 的最后一个值将是2 )。

    对此的常见解决方案是提供 i 的值作为默认参数:

    temp = lambda x, i=i: x + i
    

    由于 Python 在构造函数期间评估默认参数,这是一个帮助 Python 在调用可调用对象时使用正确的 i 值的技巧,它不会创建闭包,而是可以查看 @ 987654328@ 是当地人。

    【讨论】:

    • 谢谢!只是为了 100% 确定我理解 - 你的意思是当代码退出函数定义的范围时,用于所有 i 的值是 i 的值?
    • 我更喜欢使用functools.partial 而不是分配默认参数,这样看起来更简洁。
    • @ahura 差不多,是的。 i,在循环执行期间查找时(使用您的 print 调用),将正确获取 i 的当前值,因为它正在递增。当函数结束并返回结果时,i 的本地值将是 2,这就是 lambdas 在函数外部调用时将使用的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    • 2021-01-17
    • 1970-01-01
    • 2020-12-03
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多