闭包:一个函数嵌套另一个函数,外面的函数简称为外函数,里面的为内函数,外函数返回内函数。与普通函数不同的是,普通函数调用完后,函数中的局部变量消失,返回内存,而闭包外函数调用后,外函数的局部变量没有消失,而是继续留给内函数使用。
1,普通函数
def fn():
a = 2
return a
fn()
print(a)
#输出报错name 'a' is not defined
因为a是局部变量,函数调用后消失
2,闭包(函数嵌套,且返回为函数)
def fn():
a = 1
def f1():
return a
return f1 # 返回f1函数而不是调用
b = fn() # b即为f1,b总可以访问fn()中的变量
print(b())# 调用f1函数
# 输出为1
3,闭包的作用
def fn():
a = [1]
def f1(x):
a.append(x)
return a
return f1
b = fn()
print(b(2))
a = []
print(b(3))
# 输出为[1, 2],[1, 2, 3]
可见a = []并不影响,闭包的作用是创建一些当前函数才可访问的变量,可以将私有数据隐藏到函数中,只能通过当前函数访问
4,闭包中实例化的对象
def fn():
a = []
def f1(x):
a.append(x)
return a
return f1
b = fn()
c = fn()
d = fn()
print(id(b),id(c))#可见b,c为2个不同对象
print(c(5),c(6))#c为同一对象
print(b(5),d(6))# b,d为不同对象
# 输出为2175909442968 2176160163768
#[5, 6] [5, 6] [5] [6]