Python:动态定义函数
我有以下代码:
funcs = []
for i in range(10):
def func():
print i
funcs.append(func)
for f in funcs:
f()
问题是 func
这个函数被覆盖了。也就是说,代码的输出是:
9
9
9
...
你会怎么解决这个问题 而不 定义新的函数呢?
最好的解决办法是换一个函数的名字。也就是说:
for i in range(10):
def func+i():
...
(或者其他一些奇怪的语法)
3 个回答
0
从另一个函数返回func
是最安全的做法。
0
你可以试试
for i in range(10):
def func(j=i):
print j
funcs.append(func)
for f in funcs:
f()
13
问题不在于函数被覆盖了,而是当调用这个函数时,i
的值是在那个时候被计算的,而不是在定义函数的时候。如果你想在定义的时候就计算i
的值,可以把它放在函数声明里,作为func
的默认参数。
funcs = []
for i in range(10):
def func(value=i):
print value
funcs.append(func)
for f in funcs:
f()
默认参数只会在函数定义的时候计算一次,所以后面的循环增加i
的值不会影响到它。如果你使用
def func(i=i):
print i
这样做也是可以的,不过我用value
这个名字是为了让大家更清楚在函数内部使用的是哪个名字。