闭包这一节理解比较困难。
先看代码吧!
def f():
a = 1
def g():
print a
定义函数f(),在其内部有一个局部变量a。另外又定义了一个内部函数g()。a在g()内没有定义就直接引用了,这时g()这个内部函数就成为闭包,而它引用的这个没有在其内部定义的变量a就称为自由变量。(如果理解有误,恳请指正。)
注意自由变量首先必须是一个函数内部的局部变量,它不可能是全局变量。也就是说,在上面这个例子中,f()不可能是闭包,除非它是在另一个函数内部定义,并直接引用外层变量。
最后是书中第一个例子的理解。问号那块,还有点理解不透。
#-*-coding: utf-8-*-
# 利用func._closure追踪闭包所引用的自由变量
output = '<int %r id = %#0x val = %d>'
w = x = y = z = 1
def f1():
x = y = z = 2 # x,y,z在f1中定义,它们的作用域是f1这个函数内,没有定义就直接引用的变量是w
def f2():
y = z = 3 # y,z在f2中定义,它们的作用域是f2这个函数内,没有定义就直接引用的变量是w,x
def f3():
z = 4 # z在f3中定义,它们的作用域是f3这个函数内,没有定义就直接引用的变量是w, x, y
print output % ('w', id(w), w)
print output % ('x', id(x), x)
print output % ('y', id(y), y)
print output % ('z', id(z), z)
clo = f3.func_closure # 确定y肯定是f3这个闭包所引用的自由变量了,但是另一个引用的自由变量是?难道是x?按定义是只要是在f3以外的非全局变量?
if clo:
print "f3 closure vars:", [str(c) for c in clo]
else:
print "no closure vars"
f3()
clo = f2.func_closure # x是f2这个闭包所引用的自由变量
if clo:
print "f2 closure vars:", [str(c) for c in clo]
else:
print "no closure vars"
f2()
clo = f1.func_closure # 很显然,f1外就是全局变量,所以不可能有自由变量
if clo:
print "f1 closure vars:", [str(c) for c in clo]
else:
print "no closure vars"
f1()
至于闭包的应用,本人纯小白,以后碰到再说吧。