2017-04-18 16 views
2

私の関数の1つは外部変数を使用しますが、この関数を使用すると外部変数が変更されます。次に例を示します。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]であると思います 私は解決策の1つがこのように閉鎖を使用していることを知っています:

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

ありがとう、私はそれを見ました。それは良い答えかもしれません。しかし、あなたの答えは私のために十分です。 –

関連する問題