2017-04-18 54 views
2

我的一個函數會使用外部變量,但是當我使用這個函數時外部變量會改變。這裏有一個例子:在python中定義函數時鎖定外部變量

func_list=[] 
for i in range(0,6): 
    def func(): 
     print(i) 
    func_list.append(func) 
for j in range(0,6): 
    func_list[j]() 

我希望輸出[1,2,3,4,5,6],但實際輸出爲[6,6,6,6,6,6] 我所知道的一個解決方案是使用封閉,像這樣:

func_list=[] 
for i in range(0,6): 
    def create_func(): 
     nonlocal i 
     number=i 
     def func(): 
      print(number) 
     return func 
    func=create_func() 
    func_list.append(func) 
for j in range(0,6): 
    func_list[j]() 

此程序可輸出[1,2,3,4,5,6]。但它看起來有點難看。它使用額外的4條,至少3條線來解決這個問題...是否有一些更簡單的方法/函數裝飾來解決這個問題?

謝謝。

回答

0

試試這個:

func_list=[] 
for i in range(0,6): 
    def func(i = i): 
     print(i) 
    func_list.append(func) 

for j in range(0,6): 
    func_list[j]() 

它的工作原理,因爲i在函數定義評估其價值投入作爲默認的關鍵字參數,而不是變量

當然,如果您需要傳遞一個名爲i的關鍵字參數,則會崩潰,在這種情況下,您可能想要使用您提供的(醜陋的)解決方案。

+0

謝謝,這就是我想要的。也許這是最好的解決方案。 –

+0

@ X.Li你可以試試[這個更好的答案](http://stackoverflow.com/questions/3431676/creating-functions-in-a-loop#3431699)。我在回答這個問題後很快發現它。 – anonymoose

+0

謝謝你,我看到了。這可能是一個很好的答案。但你的回答對我來說已經足夠了。 –