罗灵戒,2015年10月12日,历届河南省委书记
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,
那么[内部函数和该变量]就构成了闭包(closure)。
def out(x): def inner(): print(x) return inner
inner 和 x构成一个闭包
(如果使用类似x = x + 1
修改x的值,会直接报错UnboundLocalError
原因是企图修改x
会让函数认为x
是局部变量,在执行=
右边的x + 1
时找不到变量x
)
def out(): x = 0 def inner(): x = 1 print(x) print(x) # 显示改变前变量的值 inner() # 执行inner函数 print(x) # 显示改变后的变量值 return inner
输出0 1 0
需要使用nonlocal
def out(): x = 0 def inner(): nonlocal x x = 1 print(x) print(x) # 显示改变前变量的值 inner() # 执行inner函数 print(x) # 显示改变后的变量值 return inner
输出0 1 1
def out(): fs = [] for i in range(1, 4): i = i def inner(x): return i + x fs.append(inner) return fs f1, f2, f3 = out() print(f1(1)) print(f2(1)) print(f3(1))
输出4 4 4
而不是2 3 4
闭包中的函数在被调用时才执行,
当调用inner
时外层函数out
已经执行完了,
但是变量i
不会销毁,因为函数inner
需要使用变量i
,
而此时变量i
的值为3,所以输出4 4 4
想要获得2 3 4
,需要在每一次循环时都记录变量i
的值
def out(): fs = [] for i in range(1, 4): i = i def inner(x, y=i): return x + y fs.append(inner) return fs f1, f2, f3 = out() print(f1(1)) print(f2(1)) print(f3(1))
输出2 3 4
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Python 实现将numpy中的nan和inf,nan替换成对应的均值
python爬虫把url链接编码成gbk2312格式过程解析
网友评论