Python lambda 绑定(bind)到本地值

标签 python closures lambda

以下代码吐出1两次,但我希望看到 0然后 1 .

def pv(v) :
  print v

x = []
for v in range(2):
  x.append(lambda : pv(v))

for xx in x:
  xx()
我希望 python lambdas 在幕后绑定(bind)到局部变量指向的引用。然而,情况似乎并非如此。我在一个大型系统中遇到了这个问题,其中 lambda 正在执行现代 C++ 的等效绑定(bind)(例如,'boost::bind'),在这种情况下,您将绑定(bind)到智能 ptr 或复制构造 lambda 的副本。
那么,如何将局部变量绑定(bind)到 lambda 函数并让它在使用时保留正确的引用?我对这种行为感到非常惊讶,因为我不希望这种行为来自带有垃圾收集器的语言。

最佳答案

更改x.append(lambda : pv(v))x.append(lambda v=v: pv(v)) .

您期望“python lambdas 在幕后绑定(bind)到局部变量指向的引用”,但这不是 Python 的工作方式。 Python 在调用函数时查找变量名,而不是在创建时查找。使用默认参数是有效的,因为默认参数是在创建函数时评估的,而不是在调用它时。

这对 lambda 来说并没有什么特别之处。考虑:

x = "before foo defined"
def foo():
    print x
x = "after foo was defined"
foo()

打印
after foo was defined

关于Python lambda 绑定(bind)到本地值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17098909/

相关文章:

.net - .NET是否有支持Erlang的 "mobile code"概念的框架?

php - Symfony2 - 如何使用 Symfony\Component\DependencyInjection\Loader\ClosureLoader 导入参数?

Java Lambda 表达式和事件信息

c++ - 不使用 std::function 将捕获的 lambda 转换为函数指针

python - 将 24 小时值转换为 HHMMSS - 时间

Python-C 集成 : Ctypes, CFFI 或创建二进制模块

swift - Swift 5 : What's 'Escaping closure captures mutating ' self' parameter' and how to fix it

Python:如何创建一个函数?例如f(x) = ax^2

python - django rest framework - 向后序列化以避免 prefetch_related

python - 如何在 OSX 上安装 numpy 和 scipy?