在循环中创建函数

在循环中创建函数

我试图在循环中创建函数:

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种不同的函数?


动漫人物
浏览 586回答 2
2回答

慕姐8265434

你遇到了一个问题后期绑定-每个函数都会查找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声明。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python