标签:
在函数内部定义的函数和外部定义的函数是一样的,只是他们无法被外部访问:
1.def g():
2. print ‘g()...‘
3.def f():
4. print ‘f()...‘
5. return g
将g的定义移入函数f的内部,防止其他代码调用g:
1.def f():
2. print ‘f()...‘
3. def g():
4. print ‘g()...‘
5. return g
但是,
1.def calc_sum(lst):
2. def lazy_sum():
3. return sum(lst)
4. return lazy_sum
这是无法把lazy_sum移到calc_sum的外部,因为它引用了calc_sum的参数lst。
像这种内层函数引用了外层函数的变量,然后返回内层函数的情况,称为闭包(Closure)。
闭包的特点是返回的函数还引用了外层函数的局部变量,像下面的:
1.#希望一次返回3个函数,分别计算1*1,2*2,3*3
2.def count():
3. fs=[]
4. for i in range(1,4):
5. def f():
6. return i*i
7. fs.append(f)
8. return fs
9.f1,f2,f3=count()
你可能认为调用f1(),f2(),f3(),结果应该是1,4,9,但实际结果全部都是9。
原因就是当count()函数返回了3个函数时,这3个函数所引用的变量i的值已经变成了3,由于f1、f2、f3并没有被调用,所以,此时他们并未计算i*i,当f1被调用时:
1.>>> f1()
2.9 #因为f1现在才计算i*i,但现在i的值已经变成了3
因此,返回函数不要引用任何循环变量或者后续会发生变化的变量
那么这个程序该怎么改写,才能使其正确返回能计算1*1,2*2,3*3的函数?
1.def count():
2. fs=[]
3. for i in range(1,4):
4. def f(j):
5. def g():
6. return j*j
7. return g
8. r=f(i)
9. fs.append(r)
10. return fs
11.f1,f2,f3=count()
12.print f1(),f2(),f3()
标签:
原文地址:http://www.cnblogs.com/XBlack/p/5043026.html