代码之家  ›  专栏  ›  技术社区  ›  sharvey

在循环中创建函数

  •  58
  • sharvey  · 技术社区  · 14 年前

    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 回复  |  直到 5 年前
        1
  •  0
  •   DMeneses    3 年前

    你遇到问题了 后期装订 i 尽可能晚(因此,在循环结束后调用时, 将设置为 2

    通过强制提前绑定轻松修复:更改 def f(): def f(i=i): 这样地:

    def f(i=i):
        return i
    

    默认值(右侧 在里面 i=i 是参数名称的默认值 ,左手边 在里面 i=i )被人仰视 def call 时间,所以本质上它们是一种专门寻找早期绑定的方法。

    如果你担心 f

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

    在你的循环中使用 f = make_f(i) 而不是 定义 声明。