2010-02-08 102 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()