一个函数和它的环境变量合在一起,就构成了一个闭包(closure)。在Python中,所谓的闭包是一个包含有环境变量取值的函数对象。
Python的问题就在于,当循环结束以后,循环体中的临时变量i不会销毁,而是继续存在于执行环境中。还有一个python的现象是,python的函数只有在执行时,才会去找函数体里的变量的值。
flist = []
for i in range(3):
def foo(x):
print x + i
flist.append(foo)
for f in flist:
f(2)
所有打印出来的都是4,4,4。此时函数里面的都i都为2。
flist = []
for i in range(3):
def foo(x, y=i):
print y
print i
print x + y
flist.append(foo)
for f in flist:
f(2)
改变下函数定义就可以。