在一个函数中再定义一个函数:
def curve_pre():
def curve():
pass
return curve
能否在外部直接用curve()
来调用curve
函数?答案是否定的,因为curve
函数这样的一个作用域仅仅是作用在curve_pre
函数内部的。要想调用curve()
函数,可以用一个变量接收curve_pre
函数,然后就可以调用了:
def curve_pre():
def curve():
print('this is curve')
return curve
p = curve_pre()
p()
-----------------------------------------
输出: this is curve
以上可以证明下面两点:
1.函数可以作为一个返回的结果返回回来
2.可以把一个函数赋值给另一个变量
再看一个例子:curve_pre
函数内部定义了变量a
,又在外部定义了变量a
,调用curve
函数最终得出的结果是什么?
def curve_pre():
a = 25
def curve(x):
return a*x*x
return curve
a = 2
p = curve_pre()
print(p(2))
-------------------------------------
输出:
100
外部重新赋值了变量并没有影响curve_pre
内部定义的变量a
这是因为闭包中a
中的值并不会到模块中取值,而是依然取得定义时的环境变量
。
Python
中的闭包是由这样一个函数
以及它在定义时候的这样一个外部环境变量
所构成的一个整体。闭包 = 函数 + 环境变量
1.上面这个例子中函数
curve
和环境变量a
形成了一个闭包之后,那么这个函数它在任何一个地方调用的时候都不会受其它重新变量赋值所影响。
2.这个变量a
是定义在函数curve
的外部,同时a
也不能是全局变量
获取存放的环境变量:
def curve_pre():
a = 25
def curve(x):
return a*x*x
return curve
p = curve_pre()
print(p.__closure__) # 存放的环境变量
print(p.__closure__[0].cell_contents) # 取出环境变量
------------------------------------------
输出:
(<cell at 0x0000000001DF8498: int object at 0x000000005A87A760>,)
25