为了账号安全,请及时绑定邮箱和手机立即绑定

在循环中创建函数

在循环中创建函数

动漫人物 2019-06-24 13:04:45
在循环中创建函数我试图在循环中创建函数:functions = []for i in range(3):     def f():         return i    # alternatively: f = lambda: i     functions.append(f)问题是所有的函数最终都是相同的。这三个函数都返回2,而不是返回0、1和2:print([f() for f in functions])# expected output: [0, 1, 2]# actual output:   [2, 2, 2]为什么会发生这种情况,我应该怎么做才能得到分别输出0、1和2的3种不同的函数?
查看完整描述

2 回答

?
慕姐8265434

TA贡献1813条经验 获得超2个赞

你遇到了一个问题后期绑定-每个函数都会查找i尽可能晚(因此,在循环结束后调用时,i将被设置为2).

通过强制早期绑定轻松修复:更改def f():def f(i=i):就像这样:

def f(i=i):
    return i

默认值(右)i在……里面i=i参数名称的默认值。i,也就是左手。i在……里面i=i)向上看def时间,不是在call时间,所以从本质上说,它们是一种寻找早期绑定的方法。

如果你担心f获得额外的参数(因此可能被错误地称为),有一种更复杂的方法,使用闭包作为“函数工厂”:

def make_f(i):
    def f():
        return i    return f

在循环中使用f = make_f(i)而不是def声明。


查看完整回答
反对 回复 2019-06-24
  • 2 回答
  • 0 关注
  • 585 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信