Python:动态定义函数

4 投票
3 回答
3267 浏览
提问于 2025-04-15 19:01

我有以下代码:

 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这个名字是为了让大家更清楚在函数内部使用的是哪个名字。

撰写回答