python 闭包
Posted spirit911
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 闭包相关的知识,希望对你有一定的参考价值。
# python 闭包 #
1.什么是闭包
如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,
那么[内部函数和该变量]就构成了闭包(closure)。
def out(x):
def inner():
print(x)
return inner
inner 和 x构成一个闭包
2.闭包使用中的坑
闭包中不能直接修改外部函数的局部变量
(如果使用类似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 闭包的主要内容,如果未能解决你的问题,请参考以下文章