Creating functions in a loop

前端 未结 2 982
执笔经年
执笔经年 2020-11-22 06:10

I\'m trying to create functions inside of a loop:

functions = []

for i in range(3):
    def f():
        return i

    # alternatively: f = lambda: i

    f         


        
2条回答
  •  梦谈多话
    2020-11-22 06:50

    You're running into a problem with late binding -- each function looks up i as late as possible (thus, when called after the end of the loop, i will be set to 2).

    Easily fixed by forcing early binding: change def f(): to def f(i=i): like this:

    def f(i=i):
        return i
    

    Default values (the right-hand i in i=i is a default value for argument name i, which is the left-hand i in i=i) are looked up at def time, not at call time, so essentially they're a way to specifically looking for early binding.

    If you're worried about f getting an extra argument (and thus potentially being called erroneously), there's a more sophisticated way which involved using a closure as a "function factory":

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

    and in your loop use f = make_f(i) instead of the def statement.

提交回复
热议问题