开发者

Python: defining functions on the fly

开发者 https://www.devze.com 2022-12-19 18:20 出处:网络
I have the following code: funcs = [] for i in range(10): def func(): print i funcs.append(func) for f in funcs:

I have the following code:

 funcs = []
 for i in range(10):
   def func():
      print i
   funcs.append(func)

 for f in funcs:
   f()

The problem is that func is being overriden. Ie the output of the code is:

9
9
9
...

How would you solve this without defining new functions?

The optimal solution wou开发者_JS百科ld be to change the name of the function. Ie:

for i in range(10):
   def func+i():
...

(or some other weird syntax)


The problem is not that func is being overwritten, it's that the value of i is being evaluated when the function is called, not when it is defined. If you want to evaluate i at definition time, put it in the function declaration, as a default argument to func.

funcs = []
for i in range(10):
    def func(value=i):
        print value
    funcs.append(func)

for f in funcs:
    f()

Default arguments are evaluated once, when the function is defined, so the incrementing loop will not affect them. This would work just as well if you used

def func(i=i):
    print i

but I used the name value to make it clear which name is being used within the function.


Returning func from another function is safest.


You could try

for i in range(10):
    def func(j=i):
        print j
    funcs.append(func)
for f in funcs:
    f()
0

精彩评论

暂无评论...
验证码 换一张
取 消