匿名函数,列表生成式

def multi():
    return [lambda x: i * x for i in range(4)]


print([m(3) for m in multi()])

为什么是这个执行结果

阅读 3.9k
1 个回答

闭包变量的迟邦定,在调用的时候才会真正计算i的值。其实等价于:

def multi():
    r = []
    for i in range(4):
        def f(x):
            return i*x

        r.append(f)
    return r

print([m(3) for m in multi()])

如果你想得到预期的结果,可以:

def multi():
    return [lambda x, i=i: i * x for i in range(4)]
print([m(3) for m in multi()])

这等价于:

def multi():
    r = []
    for i in range(4):
        def f(x, i=i):
            return i*x

        r.append(f)
    return r

print([m(3) for m in multi()])
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题