ループの中で関数を作成しループ内変数の値を使用する

ループ内で関数を作成した場合に引数を通さずに変数を関数内で使用すると、ループ中で最後に格納された値になる。
関数を大量に生成する場合なんかに全部最後の値になって困る。
その場合はdefaultを指定した引数として渡せばループ中で作成した時点の変数の値が使える。
wxPythonでボタンを生成しながらイベントを割り当てるときなんかに使える。(最初は全部のボタンが最後のボタンと同じ動作になって困った。)


サンプル

# coding:shift_jis

funcs = 
for ctr in xrange(3):
	# 最後のctrの値が使用される
	def dummy():
		print ctr
	funcs.append(dummy)

for func in funcs:
	func()

funcs = 
for ctr in xrange(3):
	# defaultを指定すればその時のctrが関数内で使える
	def dummy(ctr=ctr):
		print ctr
	funcs.append(dummy)

for func in funcs:
	func()

実行結果

2
2
2
0
1
2