关于闭包的理解

216 阅读3分钟

概念及示例

以下是以 Python 为例解释闭包的概念:

一、定义和基本概念

闭包是一种函数,它能够记住在其定义时所处的环境(外部函数中的变量),即使外部函数已经执行完毕,闭包仍然可以访问外部函数中的变量。

二、示例

以下是一个简单的 Python 闭包示例:

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 是外部函数,它接受一个参数 x
  • inner_function 是内部函数,它接受参数 y 并使用了外部函数的 x
  • 当 outer_function(10) 被调用时,它返回了 inner_function,此时 x 的值为 10,并且 inner_function 记住了这个 x 的值,形成了闭包。
  • closure 是对 inner_function 的引用,当 closure(5) 被调用时,它将 5 作为 y 的值传入,并与记住的 x(值为 10)进行计算,得到 10 + 5 = 15

三、用途

  1. 数据隐藏和封装

    可以利用闭包来创建私有变量和实现信息隐藏。

   def counter():
       count = 0
       def increment():
           nonlocal count
           count += 1
           return count
       return increment

   my_counter = counter()
   print(my_counter())  # 输出 1
   print(my_counter())  # 输出 2

这里 count 变量对于外部是隐藏的,只能通过 increment 函数来访问和修改。

  1. 创建工厂函数

    可以使用闭包来创建一系列具有相似行为但具有不同参数的函数。

   def multiply_factory(factor):
       def multiply_number(num):
           return num * factor
       return multiply_number

   double = multiply_factory(2)
   triple = multiply_factory(3)

   print(double(5))  # 输出 10
   print(triple(5))  # 输出 15

multiply_factory 函数返回的 multiply_number 函数就是一个闭包,它记住了 factor 的值。

四、注意点

  1. 对外部变量的引用:

    • 闭包中的函数会保留对外部变量的引用,即使外部函数已经执行完毕。这可能会导致一些意外的行为,特别是当外部变量的值发生变化时。
  2. 变量作用域:

    • 在闭包内部,如果要修改外部函数中的变量,需要使用 nonlocal 关键字(在 Python 3 中)来声明变量不是局部变量。

名称由来

“闭包”(Closure)这个术语的由来可以从以下几个方面理解:

一、数学领域的“闭包”概念影响

  1. 在数学中,闭包是指一个集合经过某种运算后,其结果仍在该集合内。例如,在群论中,一个集合对于特定的运算如果满足闭包性,就是指任意两个该集合中的元素进行这种运算后得到的结果仍然在这个集合中。
  2. 编程中的闭包概念与数学中的闭包有一定的相似性。在编程里的闭包,函数与其所引用的外部环境(通常是外部函数的变量等)形成一个整体,就好像是一个封闭的“包”,外部无法随意干扰内部的状态和变量,同时内部又可以操作外部的环境,具有类似数学中“闭包性”的相对封闭和自包含的特性。

二、早期编程语言研究和发展中的命名传承

  1. 在编程语言的理论研究和发展过程中,研究人员借用了数学领域中“闭包”这个相对准确且形象的术语来描述这种具有特定结构和行为的代码结构。
  2. 随着编程语言的不断演进和推广,“闭包”这个术语逐渐被广泛接受和使用,成为描述这种编程结构的标准术语。

总的来说,“闭包”这个名字的由来是结合了数学领域的概念以及编程语言自身的发展和命名习惯,它很好地概括了这种代码结构的关键特征,即函数与其引用的外部环境形成的相对封闭和自包含的关系。