2010-02-08 105 views
4

我有以下代码: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(): 
... 

(或其他一些奇怪的语法)

+0

改变函数的名称是没有必要的。名字只是名字。一旦你将它分配给funcs,你的函数的名字可能就是'funcs [0]','funcs [1]','funcs [2]'等。具有不同命名函数的唯一原因可能是if你正在搞'func .__ name__'。反正你也不应该这样做。 – jcdyer 2010-02-08 15:34:37

回答

13

问题不在于函数被覆盖,而在于调用函数时正在评估值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

+1:我准备发表非常相似的东西。 – 2010-02-08 15:20:30

0

你可以尝试

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