何が起こっているのかはこれと同じです:
>>> a = 5
>>> def foo(): print(a)
>>> foo()
5
>>> a = 10
>>> foo()
10
>>> a = 'fred'
>>> foo()
fred
そしてこれも同じです:
>>> def bar(): return b
>>> bar()
Traceback (most recent call last):
File "<pyshell#30>", line 1, in <module>
bar()
File "<pyshell#29>", line 1, in bar
def bar(): return b
NameError: global name 'b' is not defined
>>> b = 3
>>> bar()
3
関数内で使用した変数は、関数が書き込まれるときではなく呼び出されるまで解決されません。クロージャと呼ばれる魔法があります。つまり、他の関数内で定義された関数(関数は内部で定義されているため)は、外部関数で定義されたすべての変数にアクセスできますが、関数が呼び出されるまで実際には解決されません。したがって、各関数が呼び出されるまでに、は9になります。update
func
update
i
@gnibblerの回答のように、デフォルトの引数値を使用するi
と、それぞれupdate
が検索する引数(外部変数をシャドウする)に解決されるため、機能します。関数が定義されたときにデフォルトの引数値が評価されるため、これらは変更されません(これは、遅かれ早かれ多くの人が遭遇する可変のデフォルトのバグにもつながります)。