首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个python函数中的lambda表达式是怎么回事?

这个python函数中的lambda表达式是怎么回事?
EN

Stack Overflow用户
提问于 2009-05-08 20:03:44
回答 4查看 472关注 0票数 5

为什么这个创建curried函数列表的尝试不起作用?

代码语言:javascript
复制
def p(x, num):
    print x, num

def test():
    a = []
    for i in range(10):
        a.append(lambda x: p (i, x))
    return a

>>> myList = test()
>>> test[0]('test')
9 test
>>> test[5]('test')
9 test
>>> test[9]('test')
9 test

这里发生了什么事?

我期望上面的函数能做的事情是:

代码语言:javascript
复制
import functools
def test2():
    a = []
    for i in range (10):
        a.append(functools.partial(p, i))
    return a


>>> a[0]('test')
0 test
>>> a[5]('test')
5 test
>>> a[9]('test')
9 test
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-08 20:12:59

在Python中,在循环和分支中创建的变量没有作用域。使用lambda创建的所有函数都有一个对相同i变量的引用,该变量在循环的最后一次迭代中被设置为9

解决方案是创建一个返回函数的函数,从而限定迭代器变量的作用域。这就是functools.partial()方法有效的原因。例如:

代码语言:javascript
复制
def test():
    def makefunc(i):
        return lambda x: p(i, x)
    a = []
    for i in range(10):
        a.append(makefunc(i))
    return a
票数 12
EN

Stack Overflow用户

发布于 2009-05-09 06:58:27

你也可以将I绑定到懒惰的外部lambda上。

代码语言:javascript
复制
def p(x, num):
    print x, num

def test():
    a = []
    for i in range(10):
        a.append((lambda i :lambda x: p (i, x))(i))
    return a
票数 1
EN

Stack Overflow用户

发布于 2013-04-06 00:34:31

我一直很困惑,为什么这个不能工作。谢谢你的解释,'a paid nerd‘。我个人更喜欢这个解决方案:

代码语言:javascript
复制
for i in range(10):
    a.append(lambda num, val_i=i: p (val_i, num))

请注意lambdaval_i=i默认参数,它允许在循环期间捕获i的瞬时值,同时仍然有效地使lambda成为1个变量的函数。(顺便说一句:将您的x更改为num以匹配p的定义。)我更喜欢它,因为:

导入函数非常接近最初的想法,避免了定义新的命名函数,这正是lambda...

  • avoids导入functools

  • and的目的避免叠置
  1. ...

我只是搜索了一下,找到了同样问题的更详细的解释:Scope of python lambda functions and their parameters

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/841555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档