Python中函数可以引用外部函数或全局作用域中的变量。这种特性称为闭包(Closure)。
一个闭包是由一个函数及其相关的引用的变量组成的。当一个函数返回了一个闭包函数时,它也会返回一个代码块和相关环境,用来保存这些变量的引用。
在Python中,可以使用嵌套函数(Nested Function),也就是在一个函数中再定义一个函数,来引用另一个函数中的变量。例如,以下代码段展示了一个带有嵌套函数的闭包,并返回对外部作用域变量的引用。
def outer_function(x):
def inner_function(y):
return x + y
return inner_function
closure = outer_function(10)
result = closure(5)
print(result) # 输出 15
在上述代码中,我们定义了一个“outer_function”,并在其中定义了一个“inner_function”。outer_function接收一个参数“x”,并返回一个函数“inner_function”。这个内部函数接收一个参数“y”,并返回“x+y”的结果。
接下来,我们调用outer_function,并将返回的函数保存在变量“closure”中。随后,我们调用“closure(5)”并将返回值赋给“result”。这里,“closure”的调用实际上就是调用inner_function,就像我们之前返回的一样。这个函数引用了outer_function中的变量“x”,并且“x”的值是由外部的作用域(在这种情况下,是调用outer_function的代码)提供的。
在这个例子中,“closure”是一个闭包,它由“inner_function”代码块和“outer_function”环境组成。因此,闭包可以像本地变量一样使用,但它们具有外部引用的变量的寿命。
下面是另一个例子,它使用一个全局变量和一个嵌套函数来创建闭包:
x = "global"
def outer_function():
y = "outer"
def inner_function():
z = "inner"
print(z, y, x)
return inner_function
closure = outer_function()
closure()
在这个例子中,我们定义了一个全局变量“x”(在函数外部定义的变量是全局变量)。在outer_function函数内部,我们定义了一个局部变量“y”。在“inner_function”中,我们定义了另一个局部变量“z”。然后,我们使用“print”语句输出这三个变量的值。
接着,我们调用“outer_function”,并保存返回的闭包函数“inner_function”到变量“closure”中。最后,我们调用“closure”函数并输出结果“inner outer global”。
这个例子演示了如何在函数内部访问全局变量,并在全局、外部主函数以及内部嵌套函数之间传递变量。
总之,闭包是一个很强大的特性,可以让我们的代码更加模块化和优雅。使用闭包能够更好的分离功能模块和模块间的作用域,提高了代码的可读性和可维护性。