Python:动态定义函数

时间:2010-02-08 15:06:27

标签: python lambda

我有以下代码:

 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 :(得分:13)

问题不在于func被覆盖,而是在调用函数时评估i的值,而不是在定义它时。如果要在定义时评估i,请将其放在函数声明中,作为func的默认参数。

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

for f in funcs:
    f()

默认参数在定义函数时被计算一次,因此递增循环不会影响它们。如果您使用

,这也可以
def func(i=i):
    print i

但是我使用了名称value来明确函数中使用的名称。

答案 1 :(得分:0)

从另一个函数is safest返回func

答案 2 :(得分:0)

你可以尝试

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