2017-10-14 12 views
-2

以下のコードの出力が0,1,2,3,4の理由を説明してください。LEGB Python変数の範囲

fun=[] 
for i in range(5): 
    def f(i=i): 
     #i=10 
     print(i) 
    fun.append(f) 
#print(fun,i) 
for f in fun: 
    f() 

デフォルト値(i = i)を指定するとどうなりますか?

答えて

0

ここでの問題は、一般的なベストプラクティスに従い、変数に同じ名前を付けないことで、簡単に回避できる可変スコープの問題です。

最初のforループでは、一連の関数を作成してリストに追加しています。 2番目のforループでは、これらの関数のそれぞれをリストから呼び出して実行します。関数fの定義では、iのデフォルト値はiです。ローカル関数のパラメータi(最初のもの)には、ループの繰り返しごとにインクリメントされるグローバル変数iの値が割り当てられます。関数fの中で、printステートメントはローカル変数iを出力します(可変スコープルールのため)。この最初のforループの結果は、ローカルパラメータiを出力する5つの関数のリストですが、ローカルパラメータiにはそれぞれ異なるデフォルト値が与えられています。これは、すべての競合する変数と関数名を排除し、コードをより読みやすくわかりやすい

function_list = [] 
for index in range(5): 
    def print_func(val=index): 
     print(val) 
    function_list.append(print_func) 

for func in function_list: 
    func() 

:として

このコードは、より明確に記述することができます。

可変スコープの詳細についてはhttp://python-textbok.readthedocs.io/en/1.0/Variables_and_Scope.htmlをご覧ください。

+0

ありがとうございました。 –