如何返回使用变量值的函数? [复制]
Posted
技术标签:
【中文标题】如何返回使用变量值的函数? [复制]【英文标题】: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。
【问题讨论】:
【参考方案1】:闭包晚绑定,这意味着它们将在调用时使用它们已定义的范围内的最后一个值i
(在这种情况下,i
的最后一个值将是2
)。
对此的常见解决方案是提供 i
的值作为默认参数:
temp = lambda x, i=i: x + i
由于 Python 在构造函数期间评估默认参数,这是一个帮助 Python 在调用可调用对象时使用正确的 i
值的技巧,它不会创建闭包,而是可以查看 @ 987654328@ 是当地人。
【讨论】:
关于这个答案的更多信息quickinsights.io/python/python-closures-and-late-binding 谢谢!只是为了 100% 确定我理解 - 你的意思是当代码退出函数定义的范围时,用于所有 i 的值是 i 的值? 我更喜欢使用functools.partial
而不是分配默认参数,这样看起来更简洁。
@ahura 差不多,是的。 i
,在循环执行期间查找时(使用您的 print
调用),将正确获取 i
的当前值,因为它正在递增。当函数结束并返回结果时,i
的本地值将是 2
,这就是 lambda
s 在函数外部调用时将使用的值。以上是关于如何返回使用变量值的函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Jquery 变量值发送或分配给 php 变量? [复制]
如何只允许 getter/setter 获取/设置变量值? [复制]