以下のコードの出力が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,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)を指定するとどうなりますか?
ここでの問題は、一般的なベストプラクティスに従い、変数に同じ名前を付けないことで、簡単に回避できる可変スコープの問題です。
最初の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をご覧ください。
ありがとうございました。 –