Python 闭包是指嵌套函数能够访问已经执行完毕的外部函数中的变量。这样的变量并不绑定在本地作用域中。为了使用不可变变量(数字或字符串),我们需要使用非局部关键字 nonlocal
。
Python 闭包的主要优势在于它们可以帮助避免使用全局变量,并提供某种形式的数据隐藏。它们在 Python 的装饰器中得到了应用。
闭包与嵌套函数密切相关,并允许内部函数捕获并保留外部函数的局部状态,即使外部函数已经完成了执行。理解闭包需要熟悉嵌套函数、变量的作用域以及 Python 如何处理函数对象。
嵌套函数
在 Python 中,可以在一个函数内部定义另一个函数。这些被称为嵌套函数或内部函数。
访问外部作用域
内部函数可以访问外部即外层作用域中的变量。这就是闭包发挥作用的地方。
保持状态
当内部函数即闭包捕获并保持其外部作用域中的变量时,即使外部函数已经完成执行或作用域不再可用。
嵌套函数示例
嵌套函数指的是在另一个函数内部定义的函数。这一概念允许我们更有效地组织代码,封装功能并管理变量的作用域。
下面是一个嵌套函数的例子,其中 functionB
在 functionA
内部定义。内部函数随后从外部函数的作用域内调用。
def functionA():
print("外部函数")
def functionB():
print("内部函数")
functionB()
functionA()
输出:
外部函数
内部函数
如果外部函数接收任何参数,它可以将其传递给内部函数,如下例所示。
def functionA(name):
print("外部函数")
def functionB():
print("内部函数")
print("Hi {}".format(name))
functionB()
functionA("Python")
输出:
外部函数
内部函数
Hi Python
变量作用域
当创建闭包时,即内部函数捕获来自其外部作用域的变量时,它即使在外部函数执行完成后仍保留对那些变量的访问。这种行为允许闭包“记住”并操纵来自外部作用域的变量值。
示例
下面是一个关于闭包及其变量作用域的例子:
def outer_function(x):
y = 10
def inner_function(z):
return x + y + z
return inner_function
closure = outer_function(5)
result = closure(3)
print(result)
输出:
18
创建闭包
在 Python 中创建闭包涉及在外部函数内定义一个嵌套函数,并返回内部函数。闭包对于捕获和保持来自外部作用域的变量的状态非常有用。
示例
在下面的例子中,我们有一个 functionA
函数,它创建并返回另一个函数 functionB
。嵌套的 functionB
函数就是闭包。
外部 functionA
函数返回 functionB
函数并将其赋值给 myfunction
变量。即使 functionA
已经完成了执行,printer
闭包仍然可以访问 name
变量。
下面是一个在 Python 中创建闭包的例子:
def functionA(name):
name = "新的名字"
def functionB():
print(name)
return functionB
myfunction = functionA("我的名字")
myfunction()
输出:
新的名字
非局部关键字
在 Python 中,nonlocal
关键字允许访问外部局部作用域中的变量。这在闭包中用来修改存在于外部变量作用域中的不可变变量。下面是一个使用 nonlocal
关键字的闭包示例。
def functionA():
counter = 0
def functionB():
nonlocal counter
counter += 1
return counter
return functionB
myfunction = functionA()
retval = myfunction()
print("计数器:", retval)
retval = myfunction()
print("计数器:", retval)
retval = myfunction()
print("计数器:", retval)
输出:
计数器: 1
计数器: 2
计数器: 3