闭包
在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包
简单闭包
def outer(logo):
def inner(msg):
print("<%s>%s<%s>" % (logo, msg, logo))
return inner
fn1 = outer("中国")
fn1("江苏省")
fn1("南京市")
fn2 = outer("美国")
fn2("华盛顿")
fn2("洛杉矶")
首先向外部函数传参,并返回内部函数
fn1 = outer(“中国”)
再向内部函数传参
fn1(“江苏省”)
内部函数修改外部函数的变量
如果想要在内部函数中修改外部函数的变量,使用nonlocal
def outer(num1):
def inner(num2):
nonlocal num1
num1 += num2
print("内部的num1:"+str(num1))
return inner
f = outer(10)
f(10)
f(10)
使用闭包实现ATM小案例
def create_account(balance=0):
def atm(num, save=True):
nonlocal balance
if save:
balance += num
print(f"存款:+{num},余额:{balance}")
else:
balance -= num
print(f"取款:+{num},余额:{balance}")
return atm
account = create_account() # 创建账户
account(100) # 存款100
account(200) # 存款200
account(150, save=False) # 取款150
闭包的优缺点
优点
- 无需定义全局变量即可实现通过函数,持续的访问、修改某个值
- 闭包使用的变量的所用于在函数内,难以被错误的调用修改
缺点
由于内部函数持续引用外部函数的值,所以会导致这一部分内存空间不被释放掉,一直占用内存