Python: defining functions on the fly
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()
精彩评论